thinkphp 8 强制要求所有自定义 php 文件首行声明 declare(strict_types=1),并严格依赖 php 8.1 的联合类型、属性提升等特性,但不支持交集类型校验与联合类型属性提升。

ThinkPHP 8 要求所有自定义 PHP 文件必须声明 declare(strict_types=1),而 PHP 8.1 本身只提供联合类型、交集类型等语法能力,不强制任何声明——TP8 把 PHP 的可选特性变成了不可绕过的工程契约。
strict_types 声明:TP8 的硬性入口闸门
打开任意控制器、模型或服务类文件,在 <?php 后第一行必须写 declare(strict_types=1);,中间不能有任何空格、BOM 或注释。
【必须是第一行且不能有空白行或BOM头】——否则类型检查完全失效,public function detail(int $id) 接收字符串参数也不会报错。
PHP 8.1 本身允许该声明存在或不存在;TP8 则把它设为运行基础,没有这行,整个框架的类型安全机制就形同虚设。
联合类型:PHP 8.1 提供语法,TP8 强制落地校验
方法一:在控制器方法中直接使用竖线声明
例如:public function update(int|string $id, array|null $data): bool
方法二:在模型属性中同步声明
例如:public int|string $user_id;,这样在 $model->user_id = $request->input('id') 赋值瞬间就触发 PHP 原生类型校验。
注意:TP8 不额外增强联合类型逻辑,完全依赖 PHP 8.1+ 引擎执行——但前提是已启用 declare(strict_types=1),否则弱类型转换仍会发生,联合类型形同虚设。
交集类型:PHP 8.1 支持,TP8 尚未在核心中显式采用
PHP 8.1 允许用 & 声明交集类型,如 LoggerInterface & FilesystemInterface,要求传入对象同时实现两个接口。
TP8 当前版本(截至 2026 年 8 月)的路由、验证、模型层均未使用交集类型作为参数约束或返回类型声明。
你可以在自定义服务类或 DTO 中自由使用交集类型,但框架本身不解析、不校验、不注入交集类型参数——它只识别联合类型与基础标量类型。
属性提升与只读属性:TP8 依赖 PHP 8.1 语法,但限制更严
第一步:确认 PHP 版本 ≥ 8.1.0
第二步:在控制器或服务类中使用构造函数属性提升
例如:public function __construct(public UserService $service, private readonly string $prefix) {}
第三步:确保容器能解析该参数——带默认值的 private ?array $config = null 是安全的;但 private array $config 无默认值则必须传参,否则容器抛出 Unresolvable dependency 错误。
TP8 不允许在属性提升中使用联合类型(如 public int|string $id),PHP 8.1 解析会直接失败,报 Parse error。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











