Из PHP руководства :
Начиная с PHP 5.3, можно опустить среднюю часть троичного оператора. Выражение expr1?: Expr3 возвращает expr1, если expr1 оценивается как TRUE, и expr3 в противном случае.
Давайте посмотрим, что вы пытаетесь сделать здесь:
$bar->getGuest() ?: $bar->getGuest()->getGender()
Как это работает, если первое $bar->getGuest()
выражение равно true
, ваша операция вернет само значение $bar->getGuest()
. Это должно работать нормально, без ошибок.
Однако, если $bar->getGuest()
возвращает что-то еще (например, null
), он запустит третье выражение, которое будет $bar->getGuest()->getGender()
.
Хорошо, мы уже установлено, что $bar->getGuest()
вернул null
, так как же тогда go и запустить другой метод ->getGender()
для нулевого значения? Вы не можете, именно поэтому вы получаете ошибку.
Нет ничего плохого в том, чтобы ваш код читался и был прост. Возможно, вы захотите сохранить начальное значение вызова метода, поэтому вам не нужно вызывать его снова, чтобы запустить getGender()
.
$guest = $bar->getGuest();
$gender = ($guest === null) ? null : $guest->getGender();