Этот код работает в PHP 7.x

$array = ['asda' => ['asdasd']];
$var = $array['asda']['asdasd'] ?? "yes!";
echo $var;

Если мы заменим ?? на ?:, как в старой версии PHP, этот код не будет работать, например:

$array = ['asda' => ['asdasd']];
$var = $array['asda']['asdasd'] ? $array['asda']['asdasd'] : "yes!";
echo $var;

Значит, мы получим такую ​​ошибку: Notice</b>: Undefined index: asdasd in <b>[...][...]</b> on line

Итак, можем ли мы использовать первый пример в PHP 7.x, не опасаясь ничего странного / неожиданного in behind? Я имею в виду, безопасно ли использовать это вместо этого, например, array_key_exists или isset

0
Kolesar 5 Окт 2018 в 08:25

1 ответ

Лучший ответ

Используйте isset(), чтобы проверить, существует ли элемент.

$var = isset($array['asda']['asdasd']) ? $array['asda']['asdasd'] : "yes!";

Старый условный оператор :? - это простой if/then/else - он проверяет истинность первого выражения, а затем возвращает либо второе, либо третье выражение в зависимости от этого. Тестовое выражение выполняется нормально, поэтому, если оно включает неопределенные переменные, индексы или свойства, вы получите обычное предупреждение об этом.

С другой стороны, новый оператор объединения с нулем ?? проверяет, определено ли первое выражение, а не NULL, а не только его истинность. Поскольку он самостоятельно проверяет, определено ли выражение, он не выдает предупреждения, когда это не так. Он специально предназначен для замены условного isset().

См. Тернарный оператор PHP против оператора объединения null

2
Barmar 5 Окт 2018 в 14:34