PHP:如何获取实现某些接口的类列表?

时间:2010-10-22 03:54:57

标签: php oop class

我有一个界面

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获取这个列表。

4 个答案:

答案 0 :(得分:46)

你不需要反思。你可以简单地使用

<强>用法

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::implementsInterfaceget_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
)