У меня есть интерфейс
interface IModule { public function Install(); }
и некоторые классы, реализующие этот интерфейс
class Module1 implements IModule { public function Install() { return true; } } class Module2 implements IModule { public function Install() { return true; } } ... class ModuleN implements IModule { public function Install() { return true; } }
Как получить список всех классов, реализующих этот интерфейс? Я хотел бы получить этот список с PHP.
Вы можете использовать функции PHP ReflectionClass::implementsInterface
и get_declared_classes
для выполнения этого:
$classes = get_declared_classes(); $implementsIModule = array(); foreach($classes as $klass) { $reflect = new ReflectionClass($klass); if($reflect->implementsInterface('IModule')) $implementsIModule[] = $klass; }
сети$classes = get_declared_classes(); $implementsIModule = array(); foreach($classes as $klass) { $reflect = new ReflectionClass($klass); if($reflect->implementsInterface('IModule')) $implementsIModule[] = $klass; }
Вам не нужно Reflection для этого. Вы можете просто использовать
class_implements
– возвращает интерфейсы, которые реализуются данным классом Применение
in_array('InterfaceName', class_implements('className'));
Пример 1 – Эхо всех классов, реализующих интерфейс Iterator
foreach (get_declared_classes() as $className) { if (in_array('Iterator', class_implements($className))) { echo $className, PHP_EOL; } }
Пример 2 – Возвращаемый массив всех классов, реализующих интерфейс Iterator
print_r( array_filter( get_declared_classes(), function ($className) { return in_array('Iterator', class_implements($className)); } ) );
Второй пример требует PHP5.3 из-за того, что callback является анонимной функцией.
Общее решение:
function getImplementingClasses( $interfaceName ) { return array_filter( get_declared_classes(), function( $className ) use ( $interfaceName ) { return in_array( $interfaceName, class_implements( $className ) ); } ); }
Чтобы проверить, кто реализует определенный интерфейс, вы можете написать функцию, как показано ниже:
<?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'));
будет выглядеть следующим образом:
[песочница] $ php whoimplementswhat.php массив ( [29] => CachingIterator [30] => Рекурсивный Кэширующий Истребитель [38] => ArrayObject [39] => ArrayIterator [40] => РекурсивныйArrayIterator [48] => SplDoublyLinkedList [49] => SplQueue [50] => SplStack [55] => SplFixedArray [56] => SplObjectStorage [111] => Phar [112] => PharData )