181 votes

Vérifier si une instance ' s classe implémente une interface ?

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

298voto

nlaq Points 11379
<pre><code></code><p>Vous pouvez utiliser l’opérateur « instanceof ». Pour l’utiliser, l’opérande de gauche est une instance de la classe et l’opérande de droite est une interface. Elle retourne true si l’objet implémente une interface particulière.</p></pre>

124voto

Jess Telford Points 1606

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.

59voto

Bill Karwin Points 204877

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

Voir http://php.net/manual/en/book.reflection.php

25voto

d.raev Points 1382

Juste pour aider les futures recherches is_subclass_of est également une bonne variante (pour PHP 5.3.7+) :

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