php 8 构建分层校验防线:启用 strict_types=1、用语义化联合类型替代 mixed、在数据入口处过滤验证、结合 phpstan 等静态分析工具闭环检查。

PHP 8 实现更安全的类型检查,核心不在“加类型”,而在构建**分层校验防线**:从声明、运行到数据源,逐层收紧。光写 string|int 或 ?User 不足以防住线上 TypeError,必须配合严格模式、静态分析与输入净化。
启用 strict_types=1 并全局贯彻
在每个 PHP 文件顶部显式声明:
-
declare(strict_types=1);必须放在文件第一行(除空白和注释外) - 它只作用于当前文件,所以控制器、服务、DTO 等所有业务文件都要加
- 开启后,
add(5, "10")会直接报TypeError,而非静默转成15
用联合类型替代 mixed,但要明确边界
联合类型不是兜底方案,而是有语义的契约:
- 写
string|int表示“业务上允许这两种值”,不是“我懒得验证” - 避免
mixed|array|object这类“上帝联合类型”,它等于没类型 - 对可能为
null的场景,优先用?User(即User|null),而非mixed - 数据库查询结果不能直接塞进联合类型参数——先用 DTO 显式映射并过滤
把类型检查延伸到数据入口处
函数签名的类型检查只管传参那一刻,不管 $_GET、JSON 或 DB 字段的原始值:
- 接收 HTTP 参数时,不用
$_GET['id'] ?? null直接传给int参数;改用filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT)或请求验证器 -
json_decode($raw, true)返回的是array|mixed,需用match或is_int()/is_string()做二次断言再赋值 - Laravel 中用
validated()取值,Hyperf 中用@Validate注解,不跳过验证层
搭配静态分析工具形成闭环
运行时检查是最后一道防线,静态分析才是预防主力:
- 在 CI 中集成 PHPStan level 8 或 Psalm —— 它能发现
?string被当成非空字符串调用strlen()的问题 - 为 DTO 属性加
@var注解,配合工具识别 JSON 解析后类型漂移 - 禁用
mixed类型(PHPStan 配置disallowMixed),逼出真实类型契约
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











