php 7.4 的 ??= 等空合并赋值运算符、php 8.0 的 mixed 类型声明在低版本中会触发解析错误;gettype() 返回值大小写变化及 $_env 默认不可用也需注意兼容性。

PHP 7.4 的 $foo ??= $bar 在 7.3 及更早版本直接报错
空合并赋值运算符是 PHP 7.4 引入的语法糖,不是所有老项目都能直接用。它等价于 if (!isset($foo)) { $foo = $bar; },但语义更紧凑。如果代码里写了 $config['timeout'] ??= 30;,在 PHP 7.3 或更低版本运行时会抛出 Parse error: syntax error, unexpected '='。
- PHP 7.4+:支持
??=、&&=、||= - PHP 7.3 及更早:只能手写
isset($x) ? $x : $y或!isset($x) && $x = $y - 注意:
??(空合并)本身从 PHP 7.0 就存在,但??=是独立语法,别混淆
PHP 8.0 的 mixed 类型声明在低版本中无法解析
PHP 8.0 加入了 mixed 作为伪类型,用于类型声明和注解。但它不是“兼容层”,而是解析器级关键字。一旦你在函数签名里写 function foo(array $data): mixed,PHP 7.x 会直接拒绝加载该文件,报错 Parse error: syntax error, unexpected 'mixed'。
- PHP 8.0+:可安全使用
mixed、static(返回类型)、never - PHP 7.4:不认识这些类型,连
declare(strict_types=1)下的mixed都会挂掉 - 替代方案:用 PHPDoc 注释
/** @return mixed */,多数 IDE 和静态分析工具(如 PHPStan)仍能识别
gettype() 返回值在 PHP 8.0 后新增了 "null" 和 "false"
这个变化很隐蔽,但会影响依赖字符串判断类型的逻辑。比如你以前写 if (gettype($x) === 'boolean') { ... } 是安全的;但若写了 if (gettype($x) !== 'boolean') { ... } 并隐含假设其余都是标量,那在 PHP 8.0+ 中遇到 null 值就会漏掉分支。
- PHP 8.0 前:
gettype(null)返回"NULL"(全大写),gettype(false)返回"boolean" - PHP 8.0 起:
gettype(null)返回"null"(小写),gettype(false)仍为"boolean",但gettype(true)也仍是"boolean" - 更稳的做法是用
is_null()、is_bool()等专用函数,而不是靠gettype()字符串匹配
超全局变量 $_ENV 默认为空,是否可用取决于 variables_order
很多人以为 $_ENV 天然包含系统环境变量,其实它只是 PHP 配置项 variables_order 的一个产物。默认值通常是 "GPCS"(GET/POST/COOKIE/SESSION),不包含 E,所以 $_ENV 是空数组——哪怕你 export 了 FOO=bar 也没用。
立即学习“PHP免费学习笔记(深入)”;
- 要启用
$_ENV,需在php.ini中设variables_order = "EGPCS",或在运行时调用putenv('FOO=bar')再用getenv('FOO') - PHP 7.1+ 推荐用
getenv('FOO')或$_SERVER['FOO'],它们不受variables_order影响 - Docker / CLI 场景下尤其容易踩坑:
docker run -e FOO=bar php:8.0-cli php -r "print_r($_ENV);"输出空数组,除非镜像提前改了配置
变量行为本身没变,但围绕变量的语法、类型系统、反射能力、环境注入方式,在 7.4→8.0 这个分水岭前后有实质性断裂。最常被忽略的是 parse-time 错误——不是运行时报错,而是根本载入失败,CI 流水线里一跑就挂,但本地开发用高版本 PHP 看不出问题。











