Подтвердить что ты не робот

Почему PHP не жалуется, когда я рассматриваю нулевое значение как массив?

В PHP у меня есть error_reporting, чтобы сообщать обо всем, включая уведомления.

Почему следующее не бросает никаких уведомлений, ошибок или чего-либо еще?

$myarray = null;
$myvalue = $myarray['banana'];

Действия по устранению неполадок:

$myarray = array();
$myvalue = $myarray['banana'];
// throws a notice, as expected ✔

$myarray = (array)null;
$myvalue = $myarray['banana'];
// throws a notice, as expected ✔

$myarray = null;
$myvalue = $myarray['banana'];
// no notice or warning thrown, $myvalue is now NULL. ✘ Why?

Возможно, это ошибка в PHP, или я просто не понимаю, как это работает.

4b9b3361

Ответ 2

Обычно, когда вы пытаетесь использовать значение одного типа, как если бы это был другой тип, возникает ошибка или предупреждение, или происходит "жонглирование типа". Например, если вы попытаетесь объединить два числа с ., они оба будут принудительно привязаны к строкам и объединены.

Однако, как объяснено на странице руководства о манипуляции с типом, это не относится к обработке массива, отличного от массива:

Поведение автоматического преобразования в массив в настоящее время undefined.

На практике поведение, возникающее, когда это "поведение w91 > " инициируется разыменованием не-массива, заключается в том, что null возвращается, как вы заметили. Это не просто влияет на нули - вы также получите null, если попытаетесь разыменовать число или ресурс.

Ответ 3

Существует три типа, которые могли бы использовать синтаксис derefence массива:

  • Массивы
  • Строки (для доступа к символу в данной позиции)
  • Объект (объекты, реализующие интерфейс ArrayAccess)

Для всех остальных типов PHP возвращает переменную undefined.

Разрушение массива обрабатывается код операции FETCH_DIM_R, в котором используется zend_fetch_dimension_address_read() для извлечения элемента.

Как вы можете видеть, есть специальный случай для NULL и случай по умолчанию, возвращающий переменную undefined.