PHP的if条件内嵌套多组花括号仍能运行?这是什么原理?
问题核心结论
这段代码能正常运行的核心原因是 PHP 7.4 之前的版本支持使用花括号{}替代方括号[]访问数组/字符串的偏移量,它根本不是你以为的多个并列条件放在花括号里,所以不存在用and还是or连接的说法,本质是一串嵌套的字符串偏移访问操作。
解析步骤
我们逐段拆解if括号内的完整表达式:!is_null(null){1 == 2}{false}{$b = 323}
- 第一步计算
!is_null(null):is_null(null)返回布尔值true,取反后得到结果true。 - 第二个部分
{1 == 2}是对前一步结果做偏移访问:- 先计算偏移量:
1 == 2的结果是false,PHP会自动把偏移量转为整数,false转int后为0 - 对布尔值做偏移访问时,PHP会先把布尔值转为字符串:
true转字符串为"1" - 这一步等价于
"1"[0],得到结果为字符串"1"
- 先计算偏移量:
- 第三个部分
{false}是对第二步得到的"1"做偏移访问:
偏移量false转int还是0,等价于"1"[0],结果仍然是字符串"1" - 第四个部分
{$b = 323}是对第三步的"1"做偏移访问:
赋值表达式$b = 323的返回值就是323作为偏移量,PHP 7.2访问超出字符串长度的偏移时,只会抛出Notice级别的提示,不会终止程序运行。
为什么输出1?
这里实际是PHP弱类型判断的特性:如果你的环境关闭了Notice报错,且整个表达式最终返回的结果被判定为真值,就会进入分支输出1。另外要注意,这种用花括号访问偏移的语法已经在PHP7.4被废弃,PHP8.0及之后版本运行这段代码会直接报语法错误,属于典型的语法陋习,不要在生产环境使用。
内容的提问来源于stack exchange,提问作者JustAC0der
相关产品推荐
相关产品推荐

