基与php运算符的优先级的一个小问题

最近又重读了一遍《PHP核心技术与最佳实践》(第二版). 在看到第404页,也就是opcache这一章节的最后一部分中出现了这么一串代码

1
2
3
4
5
6
7
$a = 3; $b = 5;

if($a = 5 || $b = 7){
$a++; $b++;
}

echo $a . " " .$b;

我乍一看绝对输出应该是 6 6.但实际跑了之后发现最终输出竟然是 1 6.搞得我非常疑惑.

后来想到运算符优先级的问题才发现, =是php运算符中优先级最低的, ||&&的运算等级都比它高,所以我以为运行流程是这样的

1
2
3
4
// 错误示范
if(($a = 5) || ($b = 7)){
$a++; $b++;
}

但实际运行流程是这样的

1
2
3
4
// 正确示范
if($a = (5 || $b = 7))/* ($a = true) */{
$a++; $b++;
}

真是细节决定成败啊.