我有一个界面
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获取这个列表。
答案 0 :(得分:46)
你不需要反思。你可以简单地使用
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,因为回调是一个匿名函数。
答案 1 :(得分:25)
您可以使用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;
}
答案 2 :(得分:12)
通用解决方案:
function getImplementingClasses( $interfaceName ) {
return array_filter(
get_declared_classes(),
function( $className ) use ( $interfaceName ) {
return in_array( $interfaceName, class_implements( $className ) );
}
);
}
答案 3 :(得分:3)
要检查谁实现特定接口,您可以编写如下函数:
<?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
)