You can also check if a class implements an interface using instanceof.
E.g.
<?php
if($myObj instanceof MyInterface) {
echo "It is! It is!";
}
?>
(PHP 5, PHP 7, PHP 8)
class_implements — Retourne les interfaces implémentées par une classe ou une interface donnée
Cette fonction retourne un tableau avec les noms des
interfaces que la classe object_or_class
ainsi que ses parents implémentent.
object_or_class
Un objet (instance) ou une chaîne de caractères (nom de la classe ou de l'interface).
autoload
Défini s'il faut autocharger si pas déjà autochargé.
Un tableau en cas de succès, ou false
quand la classe donnée n'existe pas.
Exemple #1 Exemple avec class_implements()
<?php
interface foo { }
class bar implements foo {}
print_r(class_implements(new bar));
// vous pouvez aussi spécifier le paramètre comme une chaîne de caractères
print_r(class_implements('bar'));
spl_autoload_register();
// Utilisation de l'autoloading pour charger la classe 'not_loaded'
print_r(class_implements('not_loaded', true));
?>
Résultat de l'exemple ci-dessus est similaire à :
Array ( [foo] => foo ) Array ( [foo] => foo ) Array ( [interface_de_non_chargée] => interface_de_non_chargée )
Note: Il est préférable d'utiliser
instanceof
ou la fonction is_a() pour vérifier qu'un objet implémente une interface.
instanceof
You can also check if a class implements an interface using instanceof.
E.g.
<?php
if($myObj instanceof MyInterface) {
echo "It is! It is!";
}
?>
Hint:
<?php
in_array("your-interface", class_implements($object_or_class_name));
?>
would check if 'your-interface' is ONE of the implemented interfaces.
Note that you can use something similar to be sure the class only implements that, (whyever you would want that?)
<?php
array("your-interface") == class_implements($object_or_class_name);
?>
I use the first technique to check if a module has the correct interface implemented, or else it throws an exception.
Calling class_implements with a non-loadable class name or a non-object results in a warning:
<?php
// Warning: class_implements(): Class abc does not exist and could not be loaded in /home/a.panek/Projects/sauce/lib/Sauce/functions.php on line 196
$interfaces = class_implements('abc');
?>
This is not documented and should just return FALSE as the documentation above says.
Luckily, it prints out superinterfaces as well in reverse order so iterative searching works fine:
<?php
interface InterfaceA { }
interface InterfaceB extends InterfaceA { }
class MyClass implements InterfaceB { }
print_r(class_implements(new MyClass()));
?>
prints out:
Array
(
[InterfaceB] => InterfaceB
[InterfaceA] => InterfaceA
)
The order of interfaces is not reliable and varies between PHP versions.