Почему 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, или я просто не понимаю, как это работает.

В 2006 году начался активный отчет об ошибках .

И в документации это уведомление об этом в разделе String . введите описание изображения здесь

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

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

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

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

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

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

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

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

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