今天在老王的手艺手册看到一个题目:
<?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相干学问,请接见ki4网!
以上就是PHP运算符优先级的一个破例的细致内容,更多请关注ki4网别的相干文章!