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