PHP运算符优先级的一个例外-php教程

资源魔 45 0

明天正在老王的技巧手册看到一个成绩:

<?php
if ($a = 100 && $b = 200) {
     var_dump($a, $b);
}

输入是甚么?

这个成绩, 咋一看或者感觉简略, 但其实细心斟酌其实不简略,

假如说布尔与以前的局部, 是因为优先级的成绩, 然而假如仅仅是优先级的成绩的话, 那末后果应该是:

$a = (100 && $b) = 200

而实际上的后果, 的确高优先级的&&退让给次优先级的=, 让 $b = 200 先连系了.

究其缘由, 是由于PHP其实不齐全恪守优先级的界说, 这个正在PHP的手册中也有阐明:

Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.

这样的设计, 集体没有宣布看法, 横竖正在C言语中, 这样相似的语句是断定为语法错的. PHP采纳这样的设计, 极可能是汗青缘由,

有猎奇的同窗, 会想晓得到底为何, 以前jayeeliu网友也问过:

laruence你好:

问一个php运算符优先级的成绩

$t == 1 && $tt = 2

依照php运算符优先级应该是

(($t == 1) && $tt) = 2

这个程序执行,但实际上应该是

($t == 1) && ($tt = 2)

我有些没有太了解。

其实也简略, 运算符优先级是正在存正在二义性文法的时分的一种规约规定抉择的手法, 而PHP的语法剖析文件界说中, 却让等号以及T_BOOLEAN_AND(&&)以前没有存正在了规约抵触:

expr_without_variable:
  // 有隐规定存正在, 相称于T_BOOLEAN_AND成了"一元操作符".
  |   expr T_BOOLEAN_AND  { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } expr

最初, 趁便说一下, PHP对应于T_BOOLEAN_AND 还界说了 T_LOGICAL_AND(and) 以及 T_LOGICAL_OR(or) , 这俩个的优先级都低于等号, 于是就会有了, 不少PHP入门教材示例代码中经典的:

$result = mysql_query(*)  or die(mysql_error());

相似的还能够用or来完成三元操作符(?:)的性能:

$person = $who or $person = "laruence";
//同等于:
$person = empty($who)? "laruence" : $who;

更多PHP相干常识,请拜访PHP中文网!

以上就是PHP运算符优先级的一个破例的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 运算符 优先级

抱歉,评论功能暂时关闭!