Я хочу использовать цикл foreach с переменной, но эта переменная может быть много разных типов, например NULL .
Поэтому перед тем, как foreach я тестирую это:
if(is_array($var)){ foreach($var as ...
Но я понял, что это также может быть класс, который реализует интерфейс Iterator . Может быть, я слепой, но как проверить, реализует ли класс интерфейс? Есть что-то вроде функции is_a или inherits оператор? Я нашел class_implements , я могу использовать его, но, может быть, есть что-то более простое?
И, во-вторых, что более важно, я полагаю, что эта функция существует, было бы достаточно, чтобы проверить, является ли переменная is_array или «реализует интерфейс Iterator » или мне нужно проверить что-то еще?
Если вы используете foreach внутри функции, и вы ожидаете массив или объект Traversable, вы можете ввести подсказку о том, что функция:
function myFunction(array $a) function myFunction(Traversable)
Если вы не используете foreach внутри функции или вы ожидаете, что вы можете просто использовать эту конструкцию, чтобы проверить, можете ли вы перебирать переменную:
if (is_array($a) or ($a instanceof Traversable))
foreach может обрабатывать массивы и объекты. Вы можете проверить это с помощью:
$can_foreach = is_array($var) || is_object($var); if ($can_foreach) { foreach ($var as ... }
Вам не нужно специально проверять на Traversable как другие намекали на это в своих ответах, потому что все объекты – как и все массивы – проходят через PHP.
Более технически:
foreachработает со всеми видами трассировок, т. е. с массивами, с обычными объектами (где доступны доступные свойства) и объектамиTraversable(или, скорее, объектами, которые определяют внутренний обработчикget_iterator).
( источник )
Проще говоря, в общем программировании PHP, всякий раз, когда переменная
и не
вы можете использовать foreach на нем.
Вы можете проверить экземпляр Traversable с помощью простой функции. Это будет работать для всего этого Iterator потому что Iterator extends Traversable
function canLoop($mixed) { return is_array($mixed) || $mixed instanceof Traversable ? true : false; }
<?php $var = new ArrayIterator(); var_dump(is_array($var), ($var instanceof ArrayIterator));
возвращает bool (false) bool (true)