理解php中的运算符优先级

dig*_*igo 6 php operators operator-precedence

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

 $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);
 }
Run Code Online (Sandbox Code Playgroud)

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

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

我在文档中看到了这个注释:

尽管=的优先级低于大多数其他运算符,但PHP仍然允许使用类似于以下的表达式:if(!$ a = foo()),在这种情况下,foo()的返回值将放入$ a.

这让我觉得应该首先评估=.那么!然后是&&,这不会导致无限循环.

Dav*_*ave 2

您的代码的评估如下:

while (!($apns = ($this->getApns($streamContext) && ($z < 11))))
Run Code Online (Sandbox Code Playgroud)

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

你的风格很糟糕。试试这个,它更具可读性,仅在最终值上有所不同$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);
}
Run Code Online (Sandbox Code Playgroud)