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 — Retorna as interfaces que são implementadas pela classe ou interface fornecida
Esta função retorna um array com os nomes das interfaces que o
object_or_class
fornecido e seus pais implementam.
object_or_class
Um objeto (instância de classe) ou uma string (nome da classe ou interface).
autoload
Se deve ou não carregar automaticamente se ainda não estiver carregado.
Um array em caso de sucesso, ou false
quando a classe fornecida não existe.
Exemplo #1 Exemplo de class_implements()
<?php
interface foo { }
class bar implements foo {}
print_r(class_implements(new bar));
// você também pode especificar o parâmetro como uma string
print_r(class_implements('bar'));
spl_autoload_register();
// use o carregamento automático para carregar a classe 'not_loaded'
print_r(class_implements('not_loaded', true));
?>
O exemplo acima produzirá algo semelhante a:
Array ( [foo] => foo ) Array ( [foo] => foo ) Array ( [interface_of_not_loaded] => interface_of_not_loaded )
Nota: Para verificar se um objeto implementa uma interface, use
instanceof
ou a função is_a() em vez disso.
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.