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.
这让我觉得应该首先评估=.那么!然后是&&,这不会导致无限循环.
您的代码的评估如下:
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)