Php, типизированное свойство и ленивая загрузка? Как я могу проверить, инициализирован ли он?

#php #types

Вопрос:

вы знаете, что Php 7.2 имеет типизированные свойства:

 class Test { }

class Test2
{
    private Test $test;

    public function __construct()
    {
        $this->test = new Test();
    }
}
 

пока все хорошо, но что, если я хочу иметь ленивый созданный объект?

 public function createIfNotExists()
{
    if ($this->test === null) // *ERROR
    {
    }
}
 

это не удается:

Типизированное свойство не должно быть доступно до инициализации

но я хочу проверить, либо он был создан, либо не использовался. Как это сделать?

Комментарии:

1. isset($this->test) Работает ли это?

2. isset() или !empty() ? amp; Используйте оператор null в своей собственности: private ?Test $test = null;

3. Если вы всегда инициализируете его в конструкторе, тест никогда не завершится неудачно.

4. Я думаю if (property_exists($this, "test")) , что это более уместно, но Бармар прав, что вы должны просто установить его в конструкторе.

Ответ №1:

вы, вероятно, можете это сделать

 isset($this->test)
 

Комментарии:

1. отлично, это работает. Я также попытался использовать $this->test === null, также не удалось.

2. да, потому что для использования === вам необходимо получить доступ к свойству @JohnSmith

Ответ №2:

Начиная с PHP 7.4, вы также можете использовать оператор присваивания с объединением Null ??= в своем методе

 public function createIfNotExists()
{
    $this->test ??= new Test();
}
 

Это эквивалентно

 $this->test = $this->test ?? new Test();
 

Что эквивалентно

 $this->test = isset($this->test) ? $this->test : new Test();