gpt4 book ai didi

php - 了解 php 中的运算符优先级

转载 作者:可可西里 更新时间:2023-11-01 13:24:29 26 4
gpt4 key购买 nike

我在生产中有以下代码似乎会导致无限循环。

 $z=1;
while (!$apns = $this->getApns($streamContext) && $z < 11)
{
myerror_log("unable to conncect to apple. sleep for 2 seconds and try again");
$z++;
sleep(2);
}

如何应用导致此行为的优先规则?

http://php.net/manual/en/language.operators.precedence.php

我在文档中看到这条注释:

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.

这让我认为应该首先评估 =。然后!然后是 &&,这不会导致死循环。

最佳答案

你的代码是这样计算的:

while (!($apns = ($this->getApns($streamContext) && ($z < 11))))

这就是您看到无限循环的原因(一旦 $z >= 11$apns 为假,因此条件始终为真)。这种优先级的原因是特殊规则仅适用于赋值左侧!有效(优先级低于=) .它对右边的 bool 运算符没有影响,它的行为与在任何正常语言中的行为一样。

你的风格很糟糕。试试这个,它更具可读性,只是 $z 的最终值有所不同(如果这很重要,您可以调整 break 语句。

for( $z = 1; $z < 11; ++ $z ) {
// note extra brackets to make it clear that we intend to do assignment not comparison
if( ($apns = $this->getApns($streamContext)) ) {
break;
}
myerror_log("unable to conncect to apple. sleep for 2 seconds and try again");
sleep(2);
}

关于php - 了解 php 中的运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18519473/

26 4 0