is_countable()
Функция is_countable() — встроенная функция PHP, которая проверяет, является ли переменная счётной. Введена в PHP 7.3 как языковая конструкция.
Введение
Функция is_countable() — встроенная функция PHP, которая проверяет, является ли переменная счётной, то есть можно ли её безопасно передать в count(). Значение считается счётным, если это массив или объект, реализующий интерфейс Countable. В этих двух случаях функция возвращает true, во всех остальных — false.
Функция появилась в PHP 7.3 для решения реальной проблемы. Начиная с PHP 7.2, вызов count() для значения, которое не является массивом или объектом Countable, генерирует предупреждение (а в PHP 8.0 это стало TypeError). До появления is_countable() разработчикам приходилось вручную писать is_array($x) || $x instanceof Countable для защиты от этого. Данная функция сводит такую проверку к одному понятному вызову.
На этой странице рассмотрены синтаксис, возвращаемое значение, рабочий пример, распространённый паттерн «безопасного count» и подводные камни.
Синтаксис
Синтаксис функции is_countable() выглядит следующим образом:
Синтаксис PHP-функции is_countable()
mixed is_countable(mixed $var)Примечание: указание типа mixed требует PHP 8.0+. В PHP 7.3 сигнатура просто is_countable($var).
Функция принимает один параметр, $var, — переменную для проверки.
Возвращаемое значение
is_countable() всегда возвращает boolean и никогда не вызывает ошибку, независимо от переданного значения:
$var | Возвращает |
|---|---|
Массив (например, [1, 2, 3] или []) | true |
Объект, реализующий Countable | true |
| Строка, целое число, float, boolean | false |
null | false |
Обычный объект (например, new stdClass()) | false |
Пустой массив [] всё равно является счётным — счётность определяется типом, а не наличием элементов.
Пример использования
Ниже показан пример использования функции is_countable() в PHP:
Пример PHP is_countable()
<?php
$var1 = ["apple", "banana", "orange"];
$var2 = "hello";
$var3 = new stdClass();
$var4 = 42;
var_dump(is_countable($var1)); // output: bool(true)
var_dump(is_countable($var2)); // output: bool(false)
var_dump(is_countable($var3)); // output: bool(false)
var_dump(is_countable($var4)); // output: bool(false)
class MyCountable implements Countable {
public function count(): int { return 5; }
}
$countableObj = new MyCountable();
var_dump(is_countable($countableObj)); // output: bool(true)
?>В этом примере определены четыре переменные разных типов: $var1 — массив, $var2 — строка, $var3 — обычный объект, $var4 — целое число. Затем для каждой из них вызывается is_countable(). Счётным является только $var1 (массив). Обратите внимание, что для $var3 результат false, несмотря на то что это объект: обычный stdClass не реализует Countable. Последний пример показывает, что MyCountable, реализующий интерфейс Countable, распознаётся как счётный.
Паттерн «безопасного count»
Наиболее распространённая причина использовать is_countable() — защита вызова count() от значений, которые могут оказаться несчётными: например, данных из API, базы данных или пользовательского ввода, где поле может быть null, строкой или отсутствующим массивом:
Защита count() с помощью is_countable()
<?php
function safeCount(mixed $value): int {
return is_countable($value) ? count($value) : 0;
}
echo safeCount(["a", "b", "c"]), "\n"; // output: 3
echo safeCount("not an array"), "\n"; // output: 0
echo safeCount(null), "\n"; // output: 0
?>Без такой защиты count("not an array") в PHP 8.0+ выбрасывает TypeError. is_countable() позволяет вместо аварийного завершения вернуть разумное значение по умолчанию.
Подводные камни
- Обычный объект не является счётным.
is_countable(new stdClass())возвращаетfalse. Объект должен реализовывать интерфейсCountable, чтобы проверка прошла. - Строки никогда не являются счётными, несмотря на наличие длины. Для работы с символами используйте
strlen(), а неcount(). - Функция проверяет только тип, а не вложенность.
is_countable()ничего не сообщает о вложенных массивах — сама функцияcount()принимает аргумент$modeдля рекурсивного подсчёта. - До PHP 7.3 проверку можно воспроизвести с помощью
is_array($var) || $var instanceof Countable.
Связанные функции
count()— подсчитывает элементы счётного значения; именно от этой функцииis_countable()призвана защищать.is_array()— более узкая проверка только для массивов.is_object()— проверяет, является ли значение объектом (счётным или нет).gettype()— возвращает название типа переменной.
Заключение
Функция is_countable() — полезный инструмент для проверки того, является ли переменная счётной в PHP. Она помогает избежать ошибок, которые могут возникнуть при попытке посчитать несчётные переменные, такие как строки или объекты. Используя эту функцию, разработчики могут гарантировать, что код работает только со счётными переменными, делая его более эффективным и надёжным.