Использование оператора объединения PHP Null

Имея этот пример кода с использованием третичного оператора в PHP, я получаю «значение по умолчанию».

$myObject = null; // I'm doing this for the example
$result = $myObject ? $myObject->path() : 'default value';

Однако, когда я пытаюсь использовать для этого оператор объединения null, я получаю сообщение об ошибке

Вызов функции-члена path() при нулевом значении

$result = $myObject->path() ?? 'default value';

Что я делаю не так с ?? оператор?


person bandejapaisa    schedule 14.10.2020    source источник
comment
stackoverflow.com/questions/34571330 /   -  person Umair Khan    schedule 14.10.2020


Ответы (2)


Эти фрагменты работают по-разному:

$result = $myObject ? $myObject->path() : 'default value'; говорит: используйте 'default value', если $myObject равно NULL

$result = $myObject->path() ?? 'default value'; говорит: используйте значение по умолчанию, если $myObject->path() возвращает NULL, но этот вызов может что-то вернуть только в том случае, если сам объект не является NULL

person Nico Haase    schedule 14.10.2020
comment
Ок круто. Так что я должен быть в состоянии цепочку ?? оператор. Но тогда, если я это сделаю, какой в ​​этом смысл, я мог бы также использовать третичный оператор... - person bandejapaisa; 14.10.2020
comment
Это зависит от того, чего вы хотите достичь :) Насколько я вижу, первый код, который вы используете, делает то, что должен, и более короткого пути нет. - person Nico Haase; 14.10.2020
comment
Да, я так и думал... я отредактировал свой комментарий. Как вы говорите, короче пути нет, так какой в ​​этом смысл - person bandejapaisa; 14.10.2020

?? будет работать, если левая сторона равна нулю или не установлена, однако в вашем случае левая рука не может быть оценена, если $myObject равна нулю.

В вашем случае следует учитывать новый нулевой безопасный оператор, доступный в PHP 8 (поэтому необходимо жди этого)

$result = $myObject?->path() ?? 'default value';

Это должно сделать левую сторону нулевой, если $myObject равно нулю

До тех пор вы можете просто сделать:

$result = ($myObject ? $myObject->path() : null) ?? 'default value'; 

Это отличается от вашего первого варианта использования тем, что вы получаете default value, если $myObject или $myObject->path() равны нулю.

person apokryfos    schedule 14.10.2020
comment
О, круто. Да, это тот оператор, которого я ищу! Это то, что я бы использовал в Swift. Спасибо - person bandejapaisa; 14.10.2020