华商新闻

PHP运算符优先级的一个例外

<phpif($ a=100&& $ b=200){var_dump($ a,$ b);}

什么是输出?

这个问题乍一看似乎很简单,但要仔细审查它并不容易,

如果布尔和前面的部分是由于优先级问题,但如果它只是一个优先级问题,那么结果应该是:

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

事实上,结果是高优先级&&让步给予子优先级=,让$ b=200首先结合。

原因是因为PHP并不完全符合优先级的定义,这也在PHP手册:中进行了解释

注意:虽然=的优先级低于大多数其他运算符,但PHP仍然允许使用类似于以下:的表达式if(!$ a=foo()),在这种情况下,foo()的返回值将被放入$ 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); } EXP

最后,顺便说一下,PHP还为T_BOOLEAN_AND定义了T_LOGICAL_AND(和)和T_LOGICAL_OR(或),两者的优先级都低于等号,所以会有很多经典的PHP代码示例。

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

同样,您可以使用或实现三元运算符(?):

的功能$ person=who or $ person='laruence'; //相当于: $ person=empty($ who)?'laruence': $ who;