Для тих, хто цікавиться, я розширив цю тему на невелику статтю, де подана нижче інформація в дещо кращому структурованому вигляді: Поточний посібник із набору 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, я ще не міг знайти жодної бібліотеки, яка б це робила.