PHP 8.0属性需显式声明可见性,readonly须搭配修饰符;构造函数属性提升自动创建属性,禁止重复声明;访问须区分静态/非静态,初始化仅支持常量值,空安全操作符?->防null崩溃。

要写一份真正能用在项目里的PHP 8.0属性笔记,不能只抄语法定义,得聚焦实际编码中属性声明、初始化、访问和常见报错这四个刚性环节——比如strict_types缺失导致类型静默失效,或构造器参数重复声明直接触发Fatal error。
属性声明必须带可见性修饰符
PHP 8.0起,所有类属性必须显式声明public、protected或private,不能再省略。不加修饰符会报Parse error。
这一步不可跳过,【没有默认可见性】,哪怕只是临时调试也不行。
readonly属性需搭配修饰符一起写:private readonly string $id;
立即学习“PHP免费学习笔记(深入)”;
构造函数属性提升的三步写法
第一步:在构造函数参数列表里直接加修饰符+类型+变量名,例如public function __construct(private string $name, protected int $age = 0)。
第二步:参数自动成为同名属性,无需在类体顶部重复声明private $name;,否则会Fatal error: Cannot redeclare property。
第三步:构造函数体内可追加逻辑,比如日志记录或数据校验,属性赋值已在调用前完成。
注意:含联合类型(如string|int)的参数不支持提升,反射可能失败,应改用?string并手动判空。
访问属性必须区分静态与非静态
非静态属性用→操作符:$this->name。
静态属性用::操作符:self::$count 或 static::$count。
【$this在静态方法中不可用】,强行调用会抛出Error,不是Warning。
属性初始化只能用常量值
方法一:在声明时赋默认值,如public string $status = 'pending';。
方法二:在构造函数中赋值,但仅限未提升的属性;已提升的属性由参数自动初始化,不能再写$this->xxx = ...。
禁止使用new DateTime()、[]、function() {}等运行时表达式作默认值,PHP会直接报错。
空安全访问属性链防止崩溃
当对象可能为null时,用?->代替->:$user?->profile?->avatar。
这一步操作起来很简单,链中任一环节为null,整条表达式返回null,不抛出Fatal error。
但注意:?->只适用于方法调用和属性读取,不能用于赋值或isset()判断。



















