Невозможно использовать 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.

Однако создание строки с нулевым значением работает

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

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


person Community    schedule 22.10.2020    source источник
comment
Почему вы решили, что это ошибка? Сообщение об ошибке ясно дает понять, что это сделано намеренно   -  person Phil    schedule 22.10.2020
comment
@Phil, потому что AFAIK nullable не требуется для значения null по умолчанию, не так ли? Он не выдает ошибку, когда private удаляется, поэтому сомневаюсь.   -  person    schedule 22.10.2020


Ответы (2)


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

... поскольку продвинутые параметры подразумевают объявление свойства, допустимость значений 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) {}
}
person Phil    schedule 22.10.2020

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

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

person Rain    schedule 22.10.2020