php 8 调整了运算符优先级:+/- 高于 .,导致未括号的混合表达式触发编译错误;&& 仍高于 =,and 仍低于 =;?? 高于 ?:,混用需显式括号。

有变化,最显著的是字符串连接符 . 和算术运算符 +/- 的相对优先级调整,PHP 8 开始强制要求显式括号,否则直接报错。
PHP 8 中 . 和 +/- 的优先级冲突会触发致命错误
在 PHP 7.x 中,$pdfName = "Invoice-" . $this->billing->id + 20220301 虽然逻辑模糊,但能“侥幸”运行(先拼接再加法,或依赖隐式类型转换)。PHP 8.0+ 则明确将 + 和 - 的优先级设为高于 .,导致该表达式被解析为 "Invoice-" . ($this->billing->id + 20220301)。若 $this->billing->id 是字符串(如 "1001"),就会触发 TypeError 或直接抛出 E_COMPILE_ERROR:The behavior of unparenthesized expressions containing both '.' and '+'/'-' will change in PHP 8。
- 这不是警告,是编译期错误,部署即崩
- 哪怕
$this->billing->id是整型,也不应依赖隐式行为——PHP 8 不保证后续小版本不收紧 - Laravel 邮件模板、导出文件名、日志上下文拼接等场景极易中招
&&/|| 和 = 的优先级差异仍存在,且更易误判
PHP 8 并未修改 && 高于 =、and 低于 = 这一历史设定,但因错误提示更严格,混用时暴露更快:
-
$success = $api->call() && $cache->save();→ 正确:等价于$success = ($api->call() && $cache->save()); -
$success = $api->call() and $cache->save();→ 危险:等价于($success = $api->call()) and $cache->save();,$cache->save()执行结果被丢弃 - PHP 8 不会帮你“猜意图”,
and/or应仅用于控制流(如$res = query() or die("fail");),绝不用于赋值逻辑
?? 和 ?: 的优先级关系在 PHP 8 中更关键
PHP 7 引入 ?? 后,其优先级就高于 ?:;PHP 8 沿用并强化了这一规则,导致混写极易出错:
-
$name = $user->first ?? $user->last ?: 'guest';实际执行为$name = ($user->first ?? $user->last) ?: 'guest'; - 如果
$user->first是null、$user->last是空字符串"",则整个表达式返回'guest'(因为"" ?: 'guest'为真) - 想表达“取第一个非 null 值”,必须写成
$name = $user->first ?? ($user->last ?: 'guest');,括号不可省 - PHP 8.0+ 对右侧表达式的求值更严格,未定义变量在
?:左侧会直接报Notice,而??不会
真正麻烦的不是记不住所有 20 多级优先级,而是某些组合(比如 . 和 +)在 PHP 7 下不报错,升级后第一封邮件就卡死——这种错误不会出现在单元测试里,只会在生产环境凌晨三点爆发。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











