Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP似乎在向后计算if语句_Php_Operator Precedence - Fatal编程技术网

PHP似乎在向后计算if语句

PHP似乎在向后计算if语句,php,operator-precedence,Php,Operator Precedence,因此,我有一个以下类型的PHP语句: 如果($x=函数($y)|$z==50){ 我看到的情况是,如果$z是50,$x不会被设置,因为函数从未被调用。 这真的有可能吗?我可以(而且确实)很容易地解决这个问题,但我想我很困惑,这就是正在发生的事情,我想确保我今后不会犯这样的错误 我试图找出这样的表达式是如何计算的。有没有什么地方可以让我看看php是如何被“编译”的?|比=更重要,这意味着您的表达式变成: $x = (foo($y) || ($z == 50)); 这意味着$x将始终为真或假。除此

因此,我有一个以下类型的PHP语句:

如果($x=函数($y)|$z==50){

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

|
=
更重要,这意味着您的表达式变成:

$x = (foo($y) || ($z == 50));
这意味着
$x
将始终为
。除此之外没有其他值

尝试:

或者,更具可读性:

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

您有运算符优先级问题。请检查此项

因为
|
=
具有更高的优先级,所以您的表达式实际上如下所示

if ( 
    $x = ( 
        function($y) || ( $z == 50 ) 
    ) 
) 
而不是(我认为是你的意图)


依我看,交换测试是一种很好的做法-让
$z==50
放在第一位。如果测试通过了,我们就不需要调用函数。条件是从左到右求值的。完整的代码示例或没有发生。如下面的答案所示,条件不是从左到右求值的,而是按优先顺序求值的。@watcher s/Conditions/expressions/@Danack你不是说这个话题以前已经讨论过了,是吗?;)对不起,只是几秒钟太慢了;)@NiettheDarkAbsol好的答案永远不会太慢,事实上,就是这样!啊,我还以为我甚至试着添加了偏执狂来让它起作用,但一定是弄错了。看起来很简单(而且我很愚蠢)现在!谢谢!
if ( 
    $x = ( 
        function($y) || ( $z == 50 ) 
    ) 
) 
if ( 
    ($x = function($y)) || ($z == 50) 
)