Имея фон C #, я всегда использую ?.
оператор при доступе к свойствам класса (при использовании отношений Entity Framework).
Например, если я использую это, а класс состояния будет иметь значение null, он выдаст исключение, поскольку я пытаюсь получить свойство из нулевого объекта.
var order = DB.Order.Find(1);
var status = order.status.text;
Чтобы это исправить, я мог бы сделать что-то вроде этого:
var address = order.status?.text ?? "No status";
?.
Оператор сломает первый ноль и пропустит остальные обращения.
Я столкнулся с той же ситуацией в PHP и должен был сделать что-то вроде этого:
$order = Orders::find(1);
$status = $order->status->text;
Если статус пуст, он выдаст то же исключение (пытаясь получить свойство из нулевого объекта).
Но потом я сделал это, и это сработало:
$status = $order->status->text ?? "No status";
Видимо, PHP пропускает ->text
в случае если status
нулевой.
я создал скрипку чтобы проверить, если это не только в моей среде, и на удивление, это работало просто отлично!
<?php
$j = "Hello!";
echo $a->b->c->d->e ?? $a->b->c->d ?? $a->b->c ?? $a->b ?? $j;
<< «Привет!»
Это действительно ожидаемое поведение ??
оператор в PHP? Потому что я не видел, чтобы это упоминалось в документах.
После некоторых исследований я обнаружил, что нуль-условный оператор (??
), который был добавлен в PHP 7, является в основном синтетическим сахаром для isset()
функционировать так, как если бы он использовался в троичном вызове.
echo isset($a->b->c) ? $a->b->c : "Hello!";
Документация по функции isset показывает наглядный пример попытки получить доступ к значениям глубокого массива:
<?php
$a = array ('test' => 1, 'hello' => NULL, 'pie' => array('a' => 'apple'));
// Checking deeper array values
var_dump(isset($a['pie']['a'])); // TRUE
var_dump(isset($a['pie']['b'])); // FALSE
var_dump(isset($a['cake']['a']['b'])); // FALSE
?>
isset()
функция не бросает E_NOTICE
когда переменная равна нулю, она просто пропускает остальную часть обработки. Поскольку нулевой оператор объединения в основном использует isset()
внутренне он также не будет выдавать исключение при попытке получить доступ к свойству нулевого объекта.
Вот ссылка на предложение о реализации, он содержит ссылку на запрос на слияние, содержащий исходный код этого оператора.
Других решений пока нет …