Усі три перевіряють «чи є значення», але з різною семантикою:
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() перевіряє, чи оголошена властивість у класі.