PHP似乎正在向后评估if语句

时间:2014-05-20 14:01:52

标签: php operator-precedence

所以我有一个以下类型的PHP语句:

if ($x=function($y) || $z == 50) {

我看到的情况是,如果$ z为50,则$ x未设置,因为该函数从未被调用过。 这真的有可能吗?我可以(而且确实)很容易解决这个问题,但我想我很困惑,这就是正在发生的事情,并希望确保我不会犯这样的错误 我试图找出如何评估这样的OR表达式。有没有一个地方可以看看php如何被“编译”?

2 个答案:

答案 0 :(得分:16)

您有运营商优先问题。请检查此http://www.php.net/manual/en/language.operators.precedence.php

因为||的优先级高于=,因此您的表达式看起来真的如此

if ( 
    $x = ( 
        function($y) || ( $z == 50 ) 
    ) 
) 

而不是(我认为是你的意图)

if ( 
    ($x = function($y)) || ($z == 50) 
)

答案 1 :(得分:12)

||higher precedence而非=,这意味着您的表达式变为:

$x = (foo($y) || ($z == 50));

这意味着$x始终为truefalse。没别了。

尝试:

if( ($x = foo($y)) || ($z == 50))

或者,更具可读性:

$x = foo($y);
if( $x || $z == 50)