您的代码正在评估如下:
while (!($apns = ($this->getApns($streamContext) && ($z < 11))))
这就是你看到无限循环的原因(只要$z> = 11,$apns为false,所以条件总是为真).这种优先权的原因是特殊规则仅适用于!赋值左侧有效(优先级低于=).它对右边的布尔运算符没有影响,它的行为与任何理智的语言一样.
你的风格很糟糕.试试这个,它更具可读性,只有$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);
}