В КУРСЕ?

Разбираемся в теме

Ноль исчез из данных: почему empty в PHP не означает только отсутствие значения

В учебной системе учёта остаток товара равен нулю. Программа показывает сообщение, будто сведения не переданы. Причина может быть в слишком широкой проверке: слово пусто в повседневной речи и результат empty в PHP не совпадают по смыслу. Чтобы не потерять важное значение, сначала нужно решить, какие состояния данных требуется различать.

Три состояния вместо одного пустого поля

Представим обычный массив с данными о товаре. В первом случае ключ остаток отсутствует: это поле вообще не передали. Во втором ключ присутствует, но его значение равно null; в нашем учебном соглашении это означает, что остаток неизвестен. В третьем записан целый ноль: подсчёт известен, товара нет. Значение null не имеет универсального прикладного смысла неизвестно, его назначение определяется договорённостью программы. Главное здесь то, что три состояния различаются структурно. Если объединить их раньше времени, интерфейс не сможет точно объяснить, что произошло.

Проверки отвечают на разные вопросы

Конструкция empty считает пустыми не только отсутствующие значения, но и некоторые существующие, включая числовой ноль. Поэтому она не подходит как единственная проверка того, передан ли допустимый нулевой остаток. Проверка isset для существующего нуля даст положительный результат, а для значения null отрицательный. Функция array_key_exists проверяет наличие указанного ключа в массиве и сохраняет положительный ответ даже тогда, когда соответствующее значение равно null. Таким образом, выбор зависит от вопроса: нужен ли сам ключ, значение, отличное от null, или проверка на пустоту по правилам языка.

Наличие поля ещё не означает корректность числа

Даже после проверки присутствия ключа остаётся задача проверить допустимый тип и диапазон. Например, текстовое название цвета на месте остатка не становится корректным количеством только потому, что поле существует. В учебной системе договоримся принимать неотрицательное целое число; ноль в этом диапазоне законен. Отдельно определим обработку неизвестного значения и отсутствующего поля. Такая последовательность делает поведение понятным: сначала выясняют, что передано, затем проверяют, соответствует ли это правилам задачи. Автоматическая замена любого неудобного значения нулём тоже опасна, поскольку превращает отсутствие сведений в ложное сообщение о пустом складе.

Попробуйте на практике

Составьте бумажную таблицу поведения трёх проверок. Во всех примерах сам массив существует; рассматривается только один обычный ключ без вложенных объектов.

  1. Создайте три строки: ключ отсутствует; ключ существует и содержит null; ключ существует и содержит целый ноль. Рядом запишите прикладной смысл каждого состояния в учебной системе.
  2. Для каждой строки определите результат empty: во всех трёх рассмотренных случаях он положительный. Объясните, почему этого недостаточно для различения исходных данных.
  3. Заполните результаты isset и array_key_exists. Для отсутствующего ключа оба отрицательные, для null положительна только проверка наличия ключа, для нуля обе положительные.
  4. Добавьте четвёртую строку с текстовым названием цвета вместо числа. Укажите, что наличие ключа и ненулевого значения не заменяет отдельной проверки допустимого целого остатка.

Как проверить результат. Таблица верна, если ноль не потерян, null отличается от отсутствующего ключа при проверке структуры массива, а текстовое значение не признано допустимым количеством только из-за успешной проверки наличия.

Частые вопросы

Получается, empty использовать нельзя?

Можно, когда её понятие пустоты соответствует задаче. Ошибка возникает при подмене вопроса: проверка существования поля и проверка пустоты по правилам языка могут требовать разных средств.

Array_key_exists сразу проверяет все уровни вложенности?

Нет. Она проверяет ключ в переданном массиве на соответствующем уровне. Для вложенной структуры требуется отдельно учитывать её устройство, а не ожидать поиска нужного имени во всех внутренних массивах.

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

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов