php 8 在 php 7 标量类型基础上扩展联合类型、强化可空类型语法并收紧类型推导规则,核心机制保持兼容;新增联合类型(如 string|int|float)、统一 ?type 为 type|null 的简写,禁止混合写法,错误提示更精准,并倒逼显式类型声明与逻辑验证。

PHP 7 引入了标量类型声明,PHP 8 在此基础上扩展了联合类型、可空类型语法强化和更严格的类型推导规则,但核心机制保持兼容——不是“重写”,而是“补全”和“收紧”。
PHP 7 奠定基础:支持标量类型 + 严格模式开关
PHP 7 首次允许对函数参数和返回值使用 string、int、float、bool 等标量类型声明。
- 默认是“弱类型模式”:传入
"123"给int $id参数,PHP 会自动转成整数123,不报错 - 启用
declare(strict_types=1)后进入“严格模式”:此时"123"传给int参数直接抛出TypeError - 可空类型需用
?Type语法(如?string),表示接受null或该类型
PHP 8 新增关键能力:联合类型与更自然的 null 安全表达
PHP 8.0 起正式支持联合类型(Union Types),让类型约束更贴近真实业务场景。
- 写法更简洁:
function process(string|int|float $value): void—— 不再需要靠文档或注释说明“可能是字符串或数字” -
?Type本质是Type|null的简写,PHP 8 中它被明确纳入联合类型体系,解析更一致 - 联合类型中不允许出现
mixed、void或static;也不能和?混用(如?string|int是非法的,应写成string|int|null)
行为差异:参数类型检查更早、更确定
PHP 8 对类型错误的捕获时机和提示更精准,尤其在涉及默认值和可变参数时:
- PHP 7 中,若函数有默认参数且启用了严格模式,传入
null仍不会触发默认值(因为null不等于“未传参”);PHP 8 延续此逻辑,但错误信息更明确 - PHP 8 禁止在联合类型中使用
array和callable的旧式写法(如array|string),必须用array|string(PHP 8.0+ 已支持)或更推荐的list|string(PHP 8.1+) - 构造函数属性提升(PHP 8)要求参数带类型和可见性,间接强化了参数类型必须显式声明——这倒逼团队从源头规范类型使用
实际迁移建议:别只改语法,要验逻辑
升级到 PHP 8 后,光把 string $s 改成 string|int $s 不够,还得确认调用方是否真会传整数、下游处理能否兼容两种类型。
- 用
phpstan或psalm扫描现有代码,识别隐式类型转换高危点 - 对历史接口,优先用联合类型替代宽泛的
mixed,但避免过度设计(比如string|int|float|bool|null往往说明接口职责不清) - 注意
json_encode()等内置函数在 PHP 8 中对类型更敏感(如传入INF或NaN会抛异常),它们虽不属“函数参数限定”,却常因类型误传暴露问题
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











