4

在 php-8 和旧版本中,以下代码有效

class Foo {
    public function __construct(string $string = null) {}
}

但是在php-8中,随着属性提升,它会抛出一个错误

class Foo {
    public function __construct(private string $string = null) {}
}

致命错误:不能使用 null 作为字符串类型的参数 $string 的默认值

虽然使字符串可以为空

class Foo {
    public function __construct(private ?string $string = null) {}
}

那么这也是一个错误还是预期的行为?

4

2 回答 2

6

请参阅构造函数属性提升的 RFC

...因为提升的参数意味着属性声明,所以必须显式声明可空性,并且不能从空默认值推断:

class Test {
    // Error: Using null default on non-nullable property
    public function __construct(public Type $prop = null) {}
 
    // Correct: Make the type explicitly nullable instead
    public function __construct(public ?Type $prop = null) {}
}
于 2020-10-22T05:03:28.010 回答
1

这不是错误!

class Foo {
    public function __construct(private string $string = null) {}
}

上面的代码是一个简写语法

class Foo {
    private string $string = null;
    public function __construct(string $string) {
        $this->string  = $string;
    }
}

这会产生致命错误

致命错误:字符串类型属性的默认值不能为空。

所以你不能初始化一个不能为空的类型化属性NULL

于 2020-10-22T05:05:11.013 回答