PHP 8 代码无法直接在 PHP 5 上运行,必须手动降级重写:联合类型、返回类型声明、match 表达式、构造函数属性提升等语法均不兼容,且存在底层行为差异。
PHP 8 代码直接跑在 PHP 5 上必然报错,不是“调一下就能用”,而是必须手动降级重写——因为 PHP 8 引入了大量语法层和语义层不可逆变更。
PHP 8 的联合类型(|)在 PHP 5 中完全不识别
PHP 5 解析器遇到 function foo(string|int $x): bool 会直接报 Parse error: syntax error, unexpected '|',连文件都加载不了。
- 必须拆成单类型声明 + 手动类型校验:用
is_string()和is_int()判断参数,再抛InvalidArgumentException - 返回类型声明(如
: void或: array)也得全删,PHP 5 不支持返回类型提示 - 别试图用
@抑制解析错误——语法错误无法被运行时错误处理机制捕获
match 表达式不能简单替换成 switch
match 是 PHP 8 新增的表达式,有隐式 break、严格类型比较、必须有返回值;而 PHP 5 的 switch 是语句,无返回值、松散比较、易漏 break。
- 若原
match用于赋值:$res = match($x) { 1 => 'a', default => 'b' };→ 改为switch+ 提前声明变量 + 显式break - 注意
match默认用===比较,switch默认是==,需手动加if ($x === 1)避免类型转换陷阱 - 空
default分支在match中会报UnhandledMatchError,PHP 5 里得自己补else或抛异常
构造函数属性提升(public string $name)必须展开为传统写法
PHP 5 不认识属性提升语法,__construct 参数带访问修饰符会触发 Parse error: syntax error, unexpected 'public'。