Всегда ли нулевой условный оператор ломается при первом возникновении нуля?

Имея фон 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? Потому что я не видел, чтобы это упоминалось в документах.

0

Решение

После некоторых исследований я обнаружил, что нуль-условный оператор (??), который был добавлен в 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() внутренне он также не будет выдавать исключение при попытке получить доступ к свойству нулевого объекта.

Вот ссылка на предложение о реализации, он содержит ссылку на запрос на слияние, содержащий исходный код этого оператора.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]