#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();