ПОЧЕМУ ЭТО ПРОИСХОДИТ?
Со временем PHP стал более ориентированным на безопасность языком. Настройки, которые раньше были отключены по умолчанию, теперь включены по умолчанию. Прекрасный пример этого E_STRICT
, который стал включенным по умолчанию с PHP 5.4.0 .
Кроме того, согласно документации PHP, по умолчанию E_NOTICE
отключен в php.ini. Документы PHP рекомендуют включать его в целях отладки . Однако, когда я загружаю PHP из репозитория Ubuntu - и из стека Windows BitNami - я вижу что-то еще.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Обратите внимание, что error_reporting
по умолчанию установлено производственное значение, а не значение по умолчанию. Это несколько сбивает с толку и не документировано за пределами php.ini, поэтому я не проверял это в других дистрибутивах.
Чтобы ответить на ваш вопрос, однако, эта ошибка появляется сейчас, когда она не появлялась раньше, потому что:
Вы установили PHP, и новые настройки по умолчанию несколько плохо документированы, но не исключают E_NOTICE
.
E_NOTICE
предупреждения, такие как неопределенные переменные и неопределенные индексы, на самом деле помогают сделать ваш код чище и безопаснее. Я могу вам сказать, что несколько лет назад E_NOTICE
включение было вынуждено объявить мои переменные. Это значительно облегчило изучение языка C, если не объявлять переменные, это намного больше неприятностей.
Что я могу сделать об этом?
Выключите E_NOTICE
, скопировав «Значение по умолчанию» E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
и заменив его тем, что в данный момент не прокомментировано после входа в систему error_reporting =
. Перезапустите Apache или PHP, если используете CGI или FPM. Убедитесь, что вы редактируете «правильный» php.ini. Правильным будет Apache, если вы используете PHP с Apache, fpm или php-fpm, если используете PHP-FPM, cgi, если используете PHP-CGI и т. Д. Это не рекомендуемый метод, но если у вас есть устаревший код, который собирается быть чрезвычайно трудным для редактирования, тогда это может быть вашим лучшим выбором.
Отключите E_NOTICE
на уровне файла или папки. Это может быть предпочтительнее, если у вас есть какой-то устаревший код, но в противном случае вы хотите сделать все «правильно». Чтобы сделать это, вы должны проконсультироваться с Apache2, Nginx или любым другим вашим сервером. В Apache вы бы использовали php_value
внутри <Directory>
.
Перепишите свой код, чтобы он стал чище. Если вам нужно сделать это при переходе в производственную среду или вы не хотите, чтобы кто-то видел ваши ошибки, убедитесь, что вы отключили любое отображение ошибок и только регистрируете свои ошибки (см. display_errors
И log_errors
в php.ini, и в настройках вашего сервера). ,
Чтобы расширить вариант 3: это идеал. Если вы можете пойти по этому пути, вы должны. Если вы изначально не идете по этому пути, рассмотрите возможность его перемещения в конечном итоге, протестировав свой код в среде разработки. Пока вы в этом, избавьтесь ~E_STRICT
и ~E_DEPRECATED
посмотрите, что может пойти не так в будущем. Вы увидите много незнакомых ошибок, но это позволит вам избежать неприятных проблем, когда вам потребуется обновить PHP в будущем.
Что означают ошибки?
Undefined variable: my_variable_name
- Это происходит, когда переменная не была определена перед использованием. Когда скрипт PHP выполняется, он просто принимает нулевое значение. Однако в каком сценарии вам нужно проверить переменную, прежде чем она будет определена? В конечном счете, это аргумент в пользу «небрежного кода». Как разработчик, я могу сказать вам, что мне нравится, когда я вижу проект с открытым исходным кодом, где переменные определены настолько высоко, насколько это возможно. Это облегчает определение переменных, которые появятся в будущем, и облегчает чтение / изучение кода.
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- Это происходит, когда вы пытаетесь получить доступ к значению в массиве, а оно не существует. Чтобы предотвратить эту ошибку, выполните условную проверку.
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
Другой вариант - объявить пустой массив в верхней части вашей функции. Это не всегда возможно.
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(дополнительный совет)
- Когда я сталкивался с этими и другими проблемами, я использовал IDE NetBeans (бесплатно), и он дал мне множество предупреждений и уведомлений. Некоторые из них предлагают очень полезные советы. Это не является обязательным требованием, и я больше не использую IDE, за исключением крупных проектов. Я больше
vim
человек в эти дни :).