Dans PHP, la fonction is_a () est utilisée pour détecter si un objet appartient à une certaine classe ou sous-classe d'une classe. La syntaxe est la suivante:
is_a(object $object, string $class_name, bool $allow_string = false): bool
Parmi eux, le premier paramètre doit être le nom de l'objet ou de l'objet, et le deuxième paramètre est le nom de classe. Si l'ordre de ces deux paramètres est inversé, qu'est-ce que le code aura? Cet article utilisera des exemples pour analyser les performances et les risques potentiels d' Is_A () lors de l'utilisation du mauvais ordre de paramètres.
Supposons qu'il y ait deux catégories:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true,Dog Oui Animal Sous-classes de
var_dump(is_a($dog, 'Dog')); // true,$dog Oui Dog Exemples
Dans ce code, IS_A ($ dog, 'animal') reviendra vrai , indiquant que l'objet $ dog appartient à la classe animale ou à sa sous-classe.
Si vous écrivez l'ordre des paramètres à l'envers, par exemple:
var_dump(is_a('Animal', $dog)); // Démonstration d'erreur
Que se passe-t-il à ce moment? Analysons:
Le premier argument est la chaîne «animal» , pas l'objet.
Le deuxième paramètre est l'objet $ chien , pas la chaîne de nom de classe.
Selon la définition de IS_A () , la fonction s'attend à ce que le premier paramètre soit un objet et que le deuxième paramètre est un nom de classe de chaîne, et l'ordre est inversé pour provoquer un décalage de type.
PHP 7.2 et plus lancera des avertissements ou des erreurs , tels que:
Warning: is_a() expects parameter 1 to be object, string given
La fonction renvoie fausse et ne peut pas être correctement jugée.
La logique du code échoue, entraînant un échec de jugement.
Exemple de code:
$dog = new Dog();
var_dump(is_a('Animal', $dog)); // false,Et un avertissement
is_a () permet au troisième paramètre $ allow_string d'être défini sur TRUE pour prendre en charge le premier paramètre passant dans la chaîne de nom de classe au lieu de l'objet:
var_dump(is_a('Dog', 'Animal', true)); // true,Jugement Dog Oui否继承 Animal
Mais même dans ce cas, le deuxième paramètre doit toujours être le nom de classe de chaîne, et l'ordre inverse erre toujours:
var_dump(is_a('Animal', $dog, true)); // Encore mal,Ordre des paramètres inversé
Le premier paramètre de la fonction is_a () doit être un objet (ou lorsque $ allow_string est vrai , c'est une chaîne de nom de classe), et le deuxième paramètre doit être une chaîne de nom de classe.
L'inversion de l'ordre des paramètres provoquera un décalage de type, PHP allera et reviendra faux , et le jugement sera invalide.
Une attention particulière doit être accordée à l'ordre des paramètres en développement pour éviter les vulnérabilités logiques difficiles à découvrir en raison des erreurs de transfert de paramètres.