Is countable: примеры (PHP)

is_countable в PHP: проверка возможности подсчета элементов
Раздел: Работа с переменными
is_countable(mixed $value): bool

Функция is_countable определяет, можно ли подсчитать количество элементов в переданной переменной. Она проверяет, является ли значение массивом или объектом, реализующим интерфейс Countable. Функция появилась в PHP 7.3 как удобный способ избежать ошибок типа 'Warning: count(): Parameter must be an array or an object that implements Countable'.

Аргументы функции

Функция принимает один обязательный параметр: $value - переменная, которую необходимо проверить.

Короткие примеры использования

Пример с массивом:

$arr = [1, 2, 3];
var_dump(is_countable($arr));
bool(true)

Пример с объектом Countable:

$obj = new ArrayObject([1, 2]);
var_dump(is_countable($obj));
bool(true)

Пример со скалярным значением:

$var = 'строка';
var_dump(is_countable($var));
bool(false)

Пример с null:

$var = null;
var_dump(is_countable($var));
bool(false)
Похожие функции в PHP

Для проверки типа переменной можно применять несколько функций:

Определяет, является ли переменная массивом. Не проверяет объекты с интерфейсом Countable.

Проверяет, является ли переменная итерируемой (массив или объект, реализующий Traversable). Итерируемость не всегда означает счетность.

Интерфейс Countable

Можно использовать проверку $value instanceof Countable для объектов, но она не работает с массивами. is_countable объединяет обе проверки.

is_countable предпочтительнее перед count для избежания предупреждений. Для объектов, которые могут быть Countable, но не массивами, удобнее is_countable, чем отдельные проверки.

Типичные ошибки

Передача неопределенной переменной вызывает предупреждение, но функция вернет false.

var_dump(is_countable($undefinedVar));
Warning: Undefined variable $undefinedVar
bool(false)

Использование функции с выражением, а не переменной, может приводить к неочевидным результатам, если выражение возвращает неcountable значение.

$result = is_countable(getData()); // если getData() вернет строку, будет false
Изменения в версиях PHP

Функция is_countable была добавлена в PHP 7.3. В PHP 8.0 не было изменений в поведении функции. Однако, в PHP 8.0 улучшена обработка некоторых встроенных классов, но это не затрагивает саму функцию.

Расширенные примеры

Проверка перед использованием count в цикле:

Пример php
$data = getDataFromSource(); // может вернуть массив, Countable объект или null

if (is_countable($data)) {
    echo 'Количество элементов: ' . count($data);
} else {
    echo 'Данные не поддаются подсчету';
}

Использование в условных операторах с разными типами:

Пример php
$values = [
    'массив' => [1, 2],
    'объект' => new ArrayObject([3, 4, 5]),
    'строка' => 'text',
    'число' => 42,
    'пусто' => null
];

foreach ($values as $type => $value) {
    echo $type . ': ' . (is_countable($value) ? 'countable' : 'not countable') . '\n';
}
массив: countable
объект: countable
строка: not countable
число: not countable
пусто: not countable

Проверка коллекции объектов, которые могут реализовывать Countable:

Пример php
class MyCollection implements Countable {
    private $items = [];
    public function count(): int {
        return count($this->items);
    }
    public function add($item) {
        $this->items[] = $item;
    }
}

$col = new MyCollection();
$col->add('item1');
var_dump(is_countable($col));
var_dump(count($col));
bool(true)
int(1)

Совместное использование с is_iterable:

Пример php
$data = new ArrayIterator(['a', 'b']);
var_dump(is_countable($data)); // true, т.к. ArrayIterator реализует Countable
var_dump(is_iterable($data));  // true, т.к. ArrayIterator реализует IteratorAggregate
Аналоги в других языках

Is countable в Python

В Python для проверки возможности получения длины объекта используют функцию hasattr с атрибутом '__len__'. Прямого аналога нет.

items = [1, 2, 3]
print(hasattr(items, '__len__'))
True

Is countable в Javascript

В JavaScript нет встроенной функции для такой проверки. Обычно проверяют наличие свойства length и его тип.

let arr = [1, 2];
console.log(arr && typeof arr.length === 'number');
true

Is countable в MySQL

В SQL подобные проверки не требуются, так как работа с наборами данных происходит через запросы, а не проверку типов переменных.

PHP is_countable function comments

En
Is countable Verify that the contents of a variable is a countable value