需要注意的是,类型化属性在内部永远不会初始化为默认的 null。除非您自己将它们初始化为 null。这就是为什么如果您在初始化之前尝试访问它们,您总是会遇到此错误。
**类型化属性 foo::$bar 必须在初始化之前不可访问**
<?php
class User
{
public $id;
public string $name; // 类型化属性(未初始化)
public ?string $age = null; // 类型化属性(已初始化)
}
$user = new User;
var_dump(is_null($user->id)); // bool(true)
var_dump(is_null($user->name)); // PHP 致命错误:类型化属性 User::$name 必须在初始化之前不可访问
var_dump(is_null($user->age));// bool(true)
?>
另一件值得注意的事情是,无法将对象类型的属性初始化为除 null 之外的任何其他值。因为属性的评估发生在编译时,而对象实例化发生在运行时。最后一点,由于其上下文相关的行为,不可调用类型不受支持。