如何声明可接受null值的类型化属性?为何赋值null时报类型错误?
PHP类型化属性与Null值问题解答
问题1:我能否声明一个同时可接受null值的类型化属性?
当然可以!从PHP 7.1开始,我们可以通过两种方式实现:
- 可空类型语法:在类型前加
?,比如?string,表示这个属性既可以是string类型,也可以是null - 联合类型语法:用
|连接多个类型,比如string|null,和上面的写法效果完全一致
问题2:为什么赋值null时会出现Uncaught TypeError: Typed property $description must be string, null used错误?
这个报错的原因很明确:你代码里的private string $description;只限定了属性必须是string类型,完全不允许null值。当你通过new Foo(null);传入null并赋值给这个属性时,PHP的严格类型检查机制就会触发错误——因为实际传入的类型(null)和声明的类型(string)不匹配。
修正后的示例代码
我们只需要修改属性的类型声明,让它接受null即可,同时建议给构造函数的参数也加上对应类型提示,让代码更严谨:
new Foo(null); class Foo { // 用可空类型声明,允许string或null private ?string $description; // 构造函数参数也加上对应的类型提示 public function __construct(?string $description) { $this->description = $description; // 现在不会报错了 } }
或者用联合类型的写法,效果完全相同:
new Foo(null); class Foo { private string|null $description; public function __construct(string|null $description) { $this->description = $description; } }
内容的提问来源于stack exchange,提问作者Catfish
相关产品推荐
相关产品推荐

