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

 wallyk12 июн. 2012 г., 06:22
Я согласен с @Blender: обычно он делает то, что имеет смысл, стараясь изо всех сил, учитывая то, что он знает. Это часто довольно удобно, если не беспокоить кого-то тривиальными ошибками.
 Blender12 июн. 2012 г., 06:06
PHP на самом деле не самыйlogical язык, когда дело доходит до типов данных:me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design
 Mark Amery27 сент. 2015 г., 14:25
Ух ты - я работал с PHP годами, и до сегодняшнего дня я никогда не был укушен этим безумием. Быстрый тест показывает, что это сумасшедшее дизайнерское решение остается неизменным в PHP 7. :(
 Rafał G.18 окт. 2016 г., 19:03
Вы даже можете сделать это:<?php null['banana']; и это не ошибка. Я предполагаю, что это то же самое, что и использование переменной, которая содержит нулевое значение, но это выглядит просто странно. Как и Марк, я столкнулся с этим только после использования PHP в течение нескольких лет, и я поражен.

Ответы на вопрос(3)

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

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

The behaviour of an automatic conversion to array is currently undefined.

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

 thomasrutter12 июн. 2012 г., 08:02
Я бы не хотел, чтобы они что-то осуждали, просто выдавали уведомление или предупреждение, чтобы соответствовать другим случаям, когда вы обращаетесь к несуществующему индексу массива, и предупреждать разработчиков о потенциальной ошибке.
 12 июн. 2012 г., 07:55
Ну, я бы предпочел, чтобы PHP был немного более строгим, но ... это своего рода уникальная особенность, которую, я думаю, они не захотят осудить в ближайшее время.
 thomasrutter12 июн. 2012 г., 07:51
Спасибо Нарф, пропустил ту часть страницы Type Juggling ранее. Вы бы подумали, что с их стороны было бы полезно выбрать предупреждение или уведомление, если бы они столкнулись с «неопределенным». поведение.
 11 мар. 2015 г., 12:18
Там нет типа жонглирование в оценке$myarray['banana'] (что правильно указано в этом ответе путем цитирования из документации). Исходный код PHP является доказательством. Объяснение и ссылка предоставленыthis answer.

Есть три типа, которые могут быть допустимы для использованияarray derefence синтаксис на:

Arrays Strings (to access the character at the given position) Object (objects implementing the ArrayAccess interface)

Для всех других типов PHP просто возвращаетundefined variable.

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

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

 11 мар. 2015 г., 12:17
Это правильный ответ, нет жонглирования типа при оценке$myarray['banana'].
Решение Вопроса

Есть активныйсообщение об ошибке началось в 2006 году.

И в документации это уведомление об этом встрока раздел. enter image description here

 thomasrutter05 авг. 2016 г., 01:39
Это здорово. Насколько я знаю, этого не было в документации, когда я писал это (или, возможно, я пропустил это, потому что это было в разделе строк), так что спасибо всем, кто добавил / представил это.

Ваш ответ на вопрос