Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Чим isset, empty і array_key_exists відрізняються одне від одного?

Усі три перевіряють «чи є значення», але з різною семантикою:

  • isset($a['key']) - ключ існує і значення не null.
  • array_key_exists('key', $a) - ключ існує, хай навіть зі значенням null.
  • empty($a['key']) - ключа немає або значення «порожнє»: null, false, 0, 0.0, '', '0', [].
$data = ['name' => '', 'phone' => null, 'age' => 0];

isset($data['phone']);              // false - значення null
array_key_exists('phone', $data);   // true  - ключ є
empty($data['age']);                // true  - 0 вважається порожнім
empty($data['name']);               // true
isset($data['missing']);            // false, без попередження

Де це важливо:

  • PATCH-запит до API: {"phone": null} означає «очистити телефон», а відсутній ключ - «не чіпати». Розрізнити допоможе лише array_key_exists (у Laravel - $request->has('phone') проти $request->filled('phone')).
  • empty('0') - true. Рядок «0» у формі (кількість, рейтинг) стане «порожнім». Для чисел краще явні перевірки.
  • Вкладені ключі: isset($a['user']['address']['city']) безпечно перевіряє весь ланцюжок без попереджень.

isset і empty - мовні конструкції, а не функції: не кидають попереджень на неіснуючих змінних і ключах. Через це їх легко використати для приховування опечаток - isset($usr) мовчки поверне false.

Для об'єктів: isset($obj->prop) для неініціалізованої типізованої властивості - false; property_exists() перевіряє, чи оголошена властивість у класі.

Докладніше в документації: array_key_exists

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання