Нет 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 ...
}