Чтобы проверить, кто реализует конкретный интерфейс, вы можете написать функцию, как показано ниже:
<?php
/**
* Get classes which implement a given interface
* @param string $interface_name Name of the interface
* @return array Array of names of classes. Empty array means input is a valid interface which no class is implementing. NULL means input is not even a valid interface name.
*/
function whoImplements($interface_name) {
if (interface_exists($interface_name)) {
return array_filter(get_declared_classes(), create_function('$className', "return in_array(\"$interface_name\", class_implements(\"\$className\"));"));
}
else {
return null;
}
}
Вывод примера вызова var_export(whoImplements('ArrayAccess'));
будет выглядеть следующим образом:
[sandbox]$ php whoimplementswhat.php
Array
(
[29] => CachingIterator
[30] => RecursiveCachingIterator
[38] => ArrayObject
[39] => ArrayIterator
[40] => RecursiveArrayIterator
[48] => SplDoublyLinkedList
[49] => SplQueue
[50] => SplStack
[55] => SplFixedArray
[56] => SplObjectStorage
[111] => Phar
[112] => PharData
)
Таким образом, вы не используете циклы и можете запускать свой код на более низких версиях PHP. Функция array_filter
зацикливается внутри, но внутри механизма исполнения PHP (следовательно, более производительная, чем циклы, написанные в коде PHP).