is_a(object|string $object_or_class, string $class, bool $allow_string = false): bool
$ object_or_class : peut être une chaîne d'objet ou de nom de classe.
$ Classe : le nom de la classe cible à juger.
$ allow_string : si le passage est une chaîne de nom de classe au lieu d'un objet, ce paramètre doit être défini sur true .
Exemple:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true
Vous pouvez également passer des cordes:
var_dump(is_a('Dog', 'Animal', true)); // true
$object instanceof ClassName
Exemple:
$dog = new Dog();
var_dump($dog instanceof Animal); // true
Remarque: L'instanceof ne peut être utilisée que pour les objets et ne peut pas être utilisée directement pour les chaînes de nom de classe.
Les deux renvoient une valeur booléenne pour déterminer si l'objet est une instance ou une sous-classe d'une certaine classe. mais:
is_a () est plus détendu et peut juger la chaîne de nom de classe (dans le cas de $ allow_string = true ).
L'instructionof est plus stricte et plus orientée objet, et ne peut pas juger les chaînes de nom de classe.
Dans la plupart des scénarios, l'écart de performance entre les deux peut être ignoré. Mais du point de vue de la langue, l'instance de l'instance est un opérateur qui agit directement sur l'objet et a des performances légèrement meilleures. Et is_a () est une fonction avec certaines frais généraux d'appel.
À moins que vous ne fassiez des jugements de type dans une boucle très fréquente, vous n'avez pas besoin de prêter trop d'attention à cela.
IS_A () était une fonction interne similaire avant PHP 5, et il a officiellement soutenu le formulaire actuel depuis PHP 5.
InstructionOf est un opérateur de langue et a été stable en soutien.
Si vous devez rendre votre code compatible avec les versions antérieures ou éviter les appels de fonction (tels que les remplacements de fonction, les simulations, etc.), l'instance est plus fiable.
Lorsque vous portez des jugements en utilisant le nom de classe fourni par l'utilisateur, IS_A () est facilement mal utilisé. Par exemple:
$class = $_GET['class']; // Les utilisateurs peuvent passer dans n'importe quel nom de classe
if (is_a($object, $class)) {
// ...
}
Ce type de jugement dynamique présente certains risques de sécurité. L'utilisation de l'instance OFF peut mieux limiter les structures de type et éviter les injections potentielles ou les erreurs de jugement.
Il est recommandé d'utiliser l'instance d'abord, pour les raisons suivantes:
Plus sémantique et conforme au style de programmation orienté objet.
Moins de risque d'erreur, logique de type plus clair.
Performance légèrement excellente et expression plus simple.
Lorsque quelques personnes doivent passer dans les noms de classe dynamiquement (telles que le mode d'usine, le mécanisme du plug-in), IS_A () peut être utilisé, mais définit explicitement $ allow_string = true et s'assurer que les noms de classe passés sont sûrs et dignes de confiance.
Par exemple:
$class = 'App\\Plugins\\SomeHandler';
if (is_a($handler, $class, true)) {
$handler->handle();
}
Référence Dynamic Plugin Management Exemple de code hébergé dans:
https://m66.net/examples/plugin-loader.php