PHP中1 + $newVar = 200语句的执行逻辑及运算符优先级疑问
为什么
1 + $newVar = 200;能给$newVar赋值为200? 这个问题的核心不是运算符优先级规则失效了,而是PHP的语法解析逻辑在避免错误的前提下,结合赋值表达式的特性完成了操作。咱们一步步拆解:
1. 先理清优先级的基础逻辑
正常情况下,+的优先级确实远高于=,所以如果是合法的赋值语句比如$result = 1 + $newVar,PHP会先计算1 + $newVar,再把结果赋值给$result——这完全符合优先级规则。
但如果严格按优先级解析1 + $newVar = 200,会得到(1 + $newVar) = 200,这显然是语法错误:1 + $newVar是一个“右值”(只能被读取的计算结果),你不能把值赋给它,就像你不能写5 = 200一样。
2. PHP解析器的合法调整
为了避免这种语法错误,PHP的解析器会自动调整表达式的分组方式,转而按照赋值运算符的右结合性来解析,也就是把表达式处理成:
1 + ($newVar = 200);
这时候执行顺序就清晰了:
- 先执行括号里的赋值操作:创建
$newVar变量,并把200赋值给它;同时,赋值表达式$newVar = 200本身会返回被赋予的值(也就是200)。 - 然后执行加法运算:
1 + 200得到201,但这个结果没有被存储到任何变量里,所以整个语句除了给$newVar赋值外,没有其他可见效果。
3. 结合手册例子理解
你提到的手册里的if (!$a = foo())例子,本质是同一个逻辑:
- 严格按优先级的话,
!比=优先级高,会解析成(!$a) = foo(),这同样是非法的(不能给!$a的结果赋值)。 - 解析器会调整为
!($a = foo()):先把foo()的返回值赋给$a,再对这个返回值取反,用做if的判断条件。这完全是为了保证语法合法,同时利用了“赋值表达式会返回值”的特性,并不是优先级规则失效。
总结
优先级规则是PHP解析的基础,但当严格遵循优先级会导致语法错误时,解析器会优先保证表达式的合法性,调整分组方式。而赋值表达式本身的返回值特性,让这种看似“违背优先级”的写法能正常工作。
内容的提问来源于stack exchange,提问作者Evil Elf
相关产品推荐
相关产品推荐

