tags:

views:

66

answers:

2

I've got an interface

interface IModule {
    public function Install();
}

and some classes that implement this interface

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;
    }
}

How to get a list of all classes that implement this interface? I'd like to get this list with PHP.

+6  A: 

You can use PHP's ReflectionClass::implementsInterface and get_declared_classes functions to accomplish this:

$classes = get_declared_classes();
$implementsIModule = array();
foreach($classes as $klass) {
   $reflect = new ReflectionClass($klass);
   if($reflect->implementsInterface('IModule')) 
      $implementsIModule[] = $klass;
}
Jacob Relkin
@Jacob Thanks a lot!
SaltLake
Note: This doesn't work if you're loading IModules via `__autoload`. But +1.
Billy ONeal
@SaltLake, No problem! That's what StackOverflow is for! :)
Jacob Relkin
+2  A: 

You dont need Reflection for this. You can simply use

  • class_implements — Return the interfaces which are implemented by the given class

Usage

in_array('InterfaceName', class_implements('className'));

Example 1 - Echo all classes implementing the Iterator Interface

foreach(get_declared_classes() as $className) {
    if( in_array('Iterator', class_implements($className)) ) {
        echo $className, PHP_EOL;
    }
}

Example 2 - Return array of all classes implementing the Iterator Interface

print_r( array_filter(get_declared_classes(), function($className) {
    return in_array('Iterator', class_implements($className));
}));

The second example requires PHP5.3 due to the callback being a lambda.

Gordon