Для тих, хто цікавиться, я розширив цю тему на невелику статтю, де подана нижче інформація в дещо кращому структурованому вигляді: Поточний посібник із набору PHP та порожній
ІМХО, ви повинні подумати про те, щоб не просто зробити додаток "E_NOTICE сумісним", а реструктуризувати все. Наявність у вашому коді сотень точок, які регулярно намагаються використовувати неіснуючі змінні, звучить як досить погано структурована програма. Намагання отримати доступ до неіснуючих змінних ніколи не повинно траплятися, інші мови обробляють це питання під час компіляції. Те, що PHP дозволяє це робити, не означає, що слід.
Ці застереження є для того, щоб допомогти вам, а не роздратувати. Якщо ви отримаєте попередження "Ви намагаєтесь працювати з тим, що не існує!" , ваша реакція повинна бути "На жаль, моя погана, дозвольте мені це якнайшвидше виправити". Як ще ви збираєтесь розповісти різницю між "змінними, які працюють просто не визначено", і чесно неправильним кодом, що може призвести до серйозних помилок ? Це також причина, коли ви завжди, завжди , розвиваєтесь із повідомленнями про помилки, поверненими до 11 і продовжуйте підключатися до свого коду до тих пір, поки не з’явиться жоднаNOTICE
видається. Вимкнення повідомлень про помилки призначено лише для виробничих середовищ, щоб уникнути витоку інформації та забезпечити кращу роботу користувачів навіть перед кодом помилок.
Розробити:
Вам завжди знадобиться isset
чи empty
десь у коді, єдиний спосіб зменшити їх появу - ініціалізувати свої змінні належним чином. Залежно від ситуації існують різні способи:
Аргументи функції:
function foo ($bar, $baz = null) { ... }
Там немає необхідності , щоб перевірити , є чи $bar
або $baz
встановлені всередині функції , тому що ви просто встановити їх, все , що вам потрібно турбуватися про те , якщо їх значення має значення true
чи false
(або будь-який інший).
Регулярні змінні в будь-якому місці:
$foo = null;
$bar = $baz = 'default value';
Ініціалізуйте свої змінні вгорі блоку коду, в якому ви збираєтесь їх використовувати. Це вирішує !isset
проблему, гарантує, що ваші змінні завжди мають відоме значення за замовчуванням, дають читачеві уявлення про те, на що буде працювати наступний код, і, таким чином, також служать своєрідною самодокументацією.
Масиви:
$defaults = array('foo' => false, 'bar' => true, 'baz' => 'default value');
$values = array_merge($defaults, $incoming_array);
Те саме, що вище, ви ініціалізуєте масив зі значеннями за замовчуванням і перезаписуєте їх фактичними значеннями.
У решті випадків, скажімо, шаблон, у якому ви виводите значення, які можуть бути, а можуть і не бути встановлені контролером, вам доведеться просто перевірити:
<table>
<?php if (!empty($foo) && is_array($foo)) : ?>
<?php foreach ($foo as $bar) : ?>
<tr>...</tr>
<?php endforeach; ?>
<?php else : ?>
<tr><td>No Foo!</td></tr>
<?php endif; ?>
</table>
Якщо ви регулярно використовуєте array_key_exists
, слід оцінити, для чого ви його використовуєте. Єдиний раз, коли це зміниться, це:
$array = array('key' => null);
isset($array['key']); // false
array_key_exists('key', $array); // true
Як зазначено вище, хоча ви правильно ініціалізуєте свої змінні, вам не потрібно перевіряти, чи існує ключ чи ні, оскільки ви знаєте, що він працює. Якщо ви отримуєте масив із зовнішнього джерела, то значення буде , швидше за все , НЕ буде , null
але ''
, 0
, '0'
, false
або щось подібне, тобто значення , яке можна оцінити з isset
або empty
, в залежності від вашого наміри. Якщо ви регулярно встановлюєте ключ масиву null
і хочете, щоб він означав що-небудь, але false
, наприклад, якщо у наведеному вище прикладі різні результати isset
та array_key_exists
змінюють логіку вашої програми, ви повинні запитати себе, чому. Саме існування змінної не повинно бути важливим, лише її значення має бути наслідком. Якщо ключ - true
/ false
прапор, тоді використовуйтеtrue
або false
, ні null
. Єдиним винятком з цього є бібліотеки сторонніх організацій, які хочуть null
щось означати, але оскільки null
це важко виявити в PHP, я ще не міг знайти жодної бібліотеки, яка б це робила.