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)
Для проверки типа переменной можно применять несколько функций:
Определяет, является ли переменная массивом. Не проверяет объекты с интерфейсом Countable.
Проверяет, является ли переменная итерируемой (массив или объект, реализующий Traversable). Итерируемость не всегда означает счетность.
Можно использовать проверку $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Функция is_countable была добавлена в PHP 7.3. В PHP 8.0 не было изменений в поведении функции. Однако, в PHP 8.0 улучшена обработка некоторых встроенных классов, но это не затрагивает саму функцию.
Проверка перед использованием count в цикле:
$data = getDataFromSource(); // может вернуть массив, Countable объект или null
if (is_countable($data)) {
echo 'Количество элементов: ' . count($data);
} else {
echo 'Данные не поддаются подсчету';
}Использование в условных операторах с разными типами:
$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:
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:
$data = new ArrayIterator(['a', 'b']);
var_dump(is_countable($data)); // true, т.к. ArrayIterator реализует Countable
var_dump(is_iterable($data)); // true, т.к. ArrayIterator реализует IteratorAggregateIs 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 подобные проверки не требуются, так как работа с наборами данных происходит через запросы, а не проверку типов переменных.