isset vs. array_key_exists

Совсем недавно моё невежество привело к тому, что система, к разработке которой я прикладываю свои руки и по возможности голову, на несколько часов оказалась частично непригодна для использования.

Несмотря на свой уже достаточно богатый опыт работы с PHP и давнюю сертификацию по этому языку (хотя многие к ней относятся с юморком, всё же это какая-никакая базовая проверка знаний), я понятия не имел, что isset для элемента массива со значением null вернёт false.

$arr = ['a' => null]; 
isset($arr['a']); // false
array_key_exists('a', $arr); // true

Казалось бы и в документации об этом написано, но я давно считал, что такие аксиомы наизусть знаю. Не знаю.

В процессе работы над своей задачей заметил в одном запутанном алгоритме использование array_key_exists и подумал, что заменить на isset будет безопасно. А isset, как известно, более быстрый способ проверки ключа: O(1) vs. O(n). Помимо скорости он еще и менее многословный, что обычно помогает при чтении и понимании кода.

Из-за своей самоуверенности, что такое мелкое и полезное изменение не может ничего сломать я не удосужился даже написать хоть какой-нибудь тест. Конечно, в этом случае я вряд ли написал бы правильный тест, всё же пренебрегать тестами не стоило.

Для меня это стало уроком:

  1. надо писать тесты, если их еще нет, даже при невинном на первый взгляд изменении;
  2. знания стоит периодически освежать: наша память — очень коварный механизм, с легкостью может подложить свинью.

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.