51 votes

PHP : comment obtenir une liste de classes qui implémentent certaines interfaces ?

j'ai une interface

 interface IModule {
    public function Install();
}

et quelques classes qui implémentent cette 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;
    }
}

Comment obtenir une liste de toutes les classes qui implémentent cette interface ? J'aimerais obtenir cette liste avec PHP.

35voto

Jacob Relkin Points 90729

Vous pouvez utiliser les fonctions ReflectionClass::implementsInterface et get_declared_classes PHP pour accomplir ceci :

 $classes = get_declared_classes();
$implementsIModule = array();
foreach($classes as $klass) {
   $reflect = new ReflectionClass($klass);
   if($reflect->implementsInterface('IModule')) 
      $implementsIModule[] = $klass;
}

14voto

Jeroen De Dauw Points 722

Solution générique :

 function getImplementingClasses( $interfaceName ) {
    return array_filter(
        get_declared_classes(),
        function( $className ) use ( $interfaceName ) {
            return in_array( $interfaceName, class_implements( $className ) );
        }
    );
}

6voto

Manu Points 1725

Pour vérifier qui implémente une interface particulière, vous pouvez écrire une fonction comme ci-dessous :

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

La sortie d'un exemple d'appel var_export(whoImplements('ArrayAccess')); sera la suivante :

[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
)

De cette façon, vous n'utilisez pas de boucles et vous pouvez exécuter votre code sur des versions inférieures de PHP. La fonction array_filter boucle en interne, mais à l'intérieur du moteur d'exécution PHP (donc plus performant que les boucles écrites en code PHP).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X