php 8 支持类属性原生类型声明,语法为“public string $name;”,支持标量、类名、联合类型、可空类型等;未初始化的非可空属性须在构造函数中赋值,类型校验在运行时赋值时强制触发。

PHP 8 支持在类属性上直接声明类型,语法简洁明确,无需额外注释或运行时检查。
基本写法:在属性声明时加冒号和类型
PHP 8 引入了原生的属性类型声明(Property Type Declarations),写法和函数参数类型提示类似,直接在属性名前用 : 指定类型:
- public string $name;
- private int $id = 0;
- protected ?array $tags;(支持可空类型)
- public DateTimeImmutable $createdAt;(支持类名、内置类、自定义类)
必须初始化或允许 null 的情况
如果属性有类型但没有默认值,且不是可空类型(即没加 ?),就必须在构造函数中初始化,否则会报 Fatal error:
- public string $title; → 错误:未初始化,PHP 8 不允许
- public string $title = ''; → 正确:提供默认值
- public ?string $title; → 正确:可空,初始值为 null
- public string $title; public function __construct() { $this->title = 'default'; } → 正确:构造函数中赋值
支持的类型范围
属性类型支持所有 PHP 8 允许的类型声明,包括:
- 标量类型:string、int、float、bool
- 复合类型:array、object(PHP 7.2+)、callable
- 类名与接口名:DateTime、UserRepository、JsonSerializable
- 联合类型(PHP 8.0+):public int|string $code;
- 可空类型:public ?string $email;
- 静态类型(PHP 8.1+):public static string $version;
注意 strict_types 和类型校验时机
属性类型是运行时强制校验的,赋值时立即检查。不需要 declare(strict_types=1),它对属性类型无效(该声明只影响函数参数和返回值):
- $user->name = 123; → 报 TypeError,因为期望 string
- 继承中子类不能更改父类已声明类型的属性(不可重定义类型)
- 动态属性(如 $obj->dynamicProp = 'x')仍被允许,但不参与类型检查
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











