Нет E_NOTICE для неопределенных переменных в массиве?

Итак.. Я все еще смущен этим, когда создаю массив с $array = array(); а затем вручную установить переменные, такие как:

<?php
$array[] = 1;
$array['type'] = 2;
$array['number'] = 3;

Я знаю, это нормально для PHP, но потом, когда я повторяю что-то вроде $array['none'] он не покажет E_NOTICE для неопределенных переменных.

Может кто-нибудь объяснить мне, почему?

2 ответа

Решение

Все это также объясняется на странице config doc:

Включение E_NOTICE во время разработки имеет некоторые преимущества.

В целях отладки: УВЕДОМЛЕННЫЕ сообщения будут предупреждать вас о возможных ошибках в вашем коде. Например, использование неназначенных значений предупреждено. Чрезвычайно полезно найти опечатки и сэкономить время на отладку.

УВЕДОМЛЕНИЯ сообщат вам о плохом стиле. Например, $arr[item] лучше записывать как $arr['item'], так как PHP пытается обрабатывать "item" как константу. Если это не константа, PHP предполагает, что это строковый индекс для массива.

Это довольно просто: когда вы получаете доступ к ключу, который не существует, и назначаете ему новое значение, PHP создаст этот ключ и добавит его в список (или массив). Но когда вы попытаетесь получить доступ к несуществующему ключу и попытаться отобразить его значение, PHP не потерпит крах, но сообщит, что ваш код содержит возможную ошибку:

$arr = array('foo' => 'bar');
echo $arr['fo'];

Это выдает уведомление, потому что мой код может содержать опечатку. Я могу ожидать ключ fo существовать, хотя явно нет, поэтому мне нужно еще немного поработать над своим кодом.
Другая причина, по которой выдается это уведомление, заключается в том, что поиск несуществующих свойств / ключей является "медленным". Чтобы PHP точно знал, что ключ не существует, необходимо просканировать весь массив. Это тоже не идеально, хотя иногда неизбежно. Если у вас есть код, который выдает тонны E_NOTICE х, есть вероятность, что некоторые простые if х, как:

if (!isset($arr['fo']))
{
    $arr['fo'] = '';
}
echo $arr['fo'];

Несмотря на то, что добавление большего количества кода ускорит ваш код. Не в последнюю очередь потому, что выдача уведомлений не является бесплатной (это не так дорого, но и не бесплатно).

Другие преимущества:

Уведомления также сообщают, когда вы забыли процитировать ключи массива, например

echo $arr[foo];
echo $arr['foo'];

Первоначально оба будут эхо bar, но давайте добавим 1 строку кода к этому:

define('foo', 'bar');
echo $arr[foo];
echo $arr['foo'];

Это не будет, потому что foo теперь константа, так $arr[foo] составляет $arr['bar'];, который является неопределенным индексом. Отключение уведомлений просто повторяет строковое представление NULL, которое является пустой строкой.

В основном, уведомления помогают вам. Используйте их, слушайте их и исправляйте. Если ваш сайт не работает, исправьте это. Если вы привыкли игнорировать эти уведомления, вы, вероятно, установите для своих файлов INI более "прощающие" настройки и станете ленивыми.
С течением времени ваш код будет становиться все более запутанным / вонючим, пока к тому времени у вас не возникнет трудная для отслеживания ошибка. Вы решите включить свои сообщения об ошибках в E_STRICT | E_ALL, и не сможет увидеть фактическое уведомление / предупреждение, указывающее, где на самом деле ваша ошибка, потому что ваш экран будет загроможден E_NOTICE undefined index/variable...

Будет. Если вы включили отчеты об ошибках, должно появиться предупреждение, подобное приведенному ниже:

Примечание: неопределенный индекс: отсутствует в /path/to/script.php строке X.

Чтобы проверить, попробуйте следующее:

<?php

ini_set('display_errors',1); 
error_reporting(E_ALL);

$array = array();
echo $array['none'];

И, если вы хотите убедиться, что они существуют, прежде чем пытаться использовать их в своем коде, используйте isset():

if(isset($array['none'])) {

    // do stuff ...

}

Смотрите это вживую!

Другие вопросы по тегам