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