2012-06-12 2 views
24

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

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

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

+7

+1 для юникода ✔ – Cyclone

+1

PHP на самом деле не самый * логический * язык, когда дело доходит до типов данных: http://me.veekun.com/blog/2012/04/09/php-a -fractal-of-bad-design/ – Blender

+0

Я согласен с @Blender: он обычно делает то, что делает наиболее разумным, делая все возможное, учитывая то, что он знает. Это часто довольно удобно, если не беспокоить любого, у кого есть тривиальные ошибки. – wallyk

ответ

2

Существует активная bug report началась в 2006 году

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

+0

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

9

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

Однако, как описано на the manual page about type juggling, это не тот случай, когда лечение не-массив как массив:

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

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

+0

Спасибо Narf, пропустил эту часть страницы типа Juggling раньше Вы подумали бы, что бросить предупреждение или уведомление было бы полезным выбором дизайна с их стороны, хотя, если встретить «неопределенное» поведение. – thomasrutter

+0

Ну, я бы предпочел, чтобы PHP был немного более строгим, но .. это своего рода уникальная функция, о которой я не думаю, что они скоро захотят отказаться от этого. – Narf

+0

Я бы не хотел, чтобы они ничего не осуждали, просто бросьте уведомление или предупреждение, чтобы быть в соответствии с другими временами вы получаете доступ к несуществующему индексу массива и предупреждаете об этом lopers о потенциальной ошибке. – thomasrutter

7

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

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

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

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

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

+1

Это правильный ответ, нет жонглирования типа при оценке '$ myarray ['banana']'. – axiac

Смежные вопросы