PHP三元运算符未加括号致变量赋值异常,求技术解析
PHP三元运算符与字符串连接的优先级问题解惑
这事儿本质是运算符优先级在作祟!PHP里不同运算符的执行顺序有明确规则,你遇到的不符合预期的情况,完全是因为字符串连接符(.)的优先级比三元运算符(?:)更高导致的。
咱们拆解下没加括号的代码:
$z = 'testval'; $x = 'hello ' . isset($z) ? $z : ' notfound'; var_dump($x); //testval
PHP会先执行优先级更高的字符串连接操作:'hello ' . isset($z)。这里isset($z)返回布尔值true,PHP在字符串和布尔值连接时会把true转换成字符串'1',所以这一步得到的结果是'hello 1'。
接下来这个结果再参与三元运算,相当于执行:
'hello 1' ? $z : ' notfound'
在PHP里,非空字符串会被判定为true,所以三元运算会取$z的值,也就是'testval'——这就是你看到输出testval的原因。
再看加了括号的情况:
$z = 'testval'; $x = 'hello ' . (isset($z) ? $z : ' notfound'); var_dump($x); //returns hello testval
括号强制改变了执行顺序,PHP会先计算括号内的三元运算:isset($z)为true,所以得到$z的值'testval',之后再和'hello '做字符串连接,最终就得到了预期的'hello testval'。
给个小建议:如果对运算符优先级没十足把握,加括号绝对是最稳妥的选择——既能避免这种意外,还能让代码的逻辑更清晰,毕竟不是所有人都能准确记住所有运算符的优先级顺序~
内容的提问来源于stack exchange,提问作者Toskan
相关产品推荐
相关产品推荐

