ЧОМУ ЦЕ ЗДАЄТЬСЯ?
З часом 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
ввімкнено можливість змусити мене оголосити свої змінні. Це полегшило засвоєння С, не декларували змінні, що набагато більше неприємності.
ЩО Я МОЖУ РОБИТИ ПРО НАС?
Вимкніть 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';
(додаткова порада)
- Коли я стикався з цими та іншими проблемами, я використовував NetBeans IDE (безкоштовно), і це дало мені безліч попереджень та повідомлень. Деякі з них пропонують дуже корисні поради. Це не є вимогою, і я вже не використовую IDE, крім великих проектів. Я більше
vim
людина в ці дні :).