Я хочу использовать цикл 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)