Compte tenu d’une instance de la classe, est-il possible de déterminer si elle implémente une interface particulière ? Autant que je sache, il n’existe pas une fonction intégrée de le faire directement. Quelles sont les options dois-je (le cas échéant) ?
Réponses
Trop de publicités?Comme therefromhere points, vous pouvez utiliser class_implements()
. Tout comme avec la Réflexion, cela permet de spécifier le nom de la classe comme une chaîne de caractères et ne nécessite pas une instance de la classe:
interface IInterface
{
}
class TheClass implements IInterface
{
}
$interfaces = class_implements('TheClass');
if (isset($interfaces['IInterface'])) {
echo "Yes!";
}
class_implements()
fait partie de l'extension SPL.
Voir: http://php.net/manual/en/function.class-implements.php
Tests De Performance
Certains de performance simples tests montrent que les coûts de chaque approche:
Étant donné une instance d'un objet
Construction de l'objet en dehors de la boucle (100 000 itérations) ____________________________________________ | class_implements | Réflexion | instanceOf | |------------------|------------|------------| | 140 | ms 290 ms | 35 ms | '--------------------------------------------' Construction de l'objet à l'intérieur de la boucle (100 000 itérations) ____________________________________________ | class_implements | Réflexion | instanceOf | |------------------|------------|------------| | 182 ms | 340 ms | 83 ms | à Bas prix Constructeur | 431 ms | 607 ms | 338 | ms-Cher Constructeur '--------------------------------------------'
Seulement un nom de classe
100 000 itérations ____________________________________________ | class_implements | Réflexion | instanceOf | |------------------|------------|------------| | 149 ms | 295 ms | N/A | '--------------------------------------------'
Où le coûteux __construct() est:
public function __construct() {
$tmp = array(
'foo' => 'bar',
'this' => 'that'
);
$in = in_array('those', $tmp);
}
Ces tests sont basés sur ce simple code.
Nelson LaQuet points qu' instanceof
peut être utilisé pour tester si l'objet est une instance d'une classe qui implémente une interface.
Mais instanceof
ne fait pas la distinction entre un type de classe et une interface. Vous ne savez pas si l'objet est une classe qui se trouve être appelés IInterface
.
Vous pouvez également utiliser l'API reflection en PHP pour tester cette plus précisément:
$class = new ReflectionClass('TheClass');
if ($class->implementsInterface('IInterface'))
{
print "Yep!\n";
}
Juste pour aider les futures recherches is_subclass_of est également une bonne variante (pour PHP 5.3.7+) :