Невозможно использовать null в качестве значения по умолчанию для параметра в PHP-8

В версиях php-8 и более старых работает следующий код

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

Но в php-8 вместе с продвижением собственности выдает ошибку

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

Неустранимая ошибка: нельзя использовать null в качестве значения по умолчанию для параметра $string типа string

Хотя создание строки, допускающей значение NULL, работает

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

Так это тоже ошибка или предполагаемое поведение?

2 ответа

Решение

См. RFC для продвижения свойств конструктора

... поскольку продвигаемые параметры подразумевают объявление свойства, допустимость значения NULL должна быть явно объявлена ​​и не выводится из значения по умолчанию NULL:

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) {}
}

Это не ошибка!

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

Приведенный выше код представляет собой сокращенный синтаксис для

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

Что вызывает фатальную ошибку

Неустранимая ошибка: значение по умолчанию для свойства строки типа не может быть нулевым.

Таким образом, вы не можете инициализировать типизированное свойство, не допускающее значения NULL, для NULL

Другие вопросы по тегам