IS_A () est utilisé pour déterminer si un objet est une instance d'une certaine classe, ou s'il est hérité de cette classe. La signature de la fonction est la suivante:
is_a(object $object, string $class_name, bool $allow_string = false): bool
$ objet : l'objet à détecter (ou le nom de classe, selon $ allow_string ).
$ class_name : chaîne de nom de classe cible.
$ allow_string : s'il faut permettre au premier paramètre d'être une chaîne de nom de classe au lieu d'un objet, par défaut à FAUX .
Par exemple:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true
var_dump(is_a($dog, 'Dog')); // true
Les noms de classe PHP sont insensibles à la cas, mais la chaîne de nom de classe passe lorsque IS_A () est jugée peut provoquer une confusion, en particulier lorsque les noms de classe sont passés dynamiquement.
Exemple:
$className = 'dog'; // inférieur inférieur
var_dump(is_a($dog, $className)); // false
Bien que le chien et le chien représentent la même classe, en raison du mécanisme de mise en œuvre de IS_A () , FALSE est renvoyé ici.
Solution:
Assurez-vous que les noms de classe passés dynamiquement sont dans le bon cas ou sont convertis au vrai nom de la classe. Vous pouvez utiliser get_class () ou class_exists () pour vérifier d'abord:
$className = 'dog';
if (class_exists(ucfirst($className))) {
$className = ucfirst($className);
}
var_dump(is_a($dog, $className)); // true
Lorsque le premier paramètre est une chaîne de nom de classe, la valeur par défaut IS_A () ne fera pas de jugement, mais reviendra False .
var_dump(is_a('Dog', 'Animal')); // false
Pour obtenir un jugement basé sur la chaîne de nom de classe, vous devez passer dans le troisième paramètre True :
var_dump(is_a('Dog', 'Animal', true)); // true
Ceci est très important dans certains scénarios qui reposent sur des relations de classe de classe jugés dynamiquement.
Les noms de classe dynamique contiennent souvent des espaces de noms et le nom complet de la classe d'espace de noms doit être utilisé.
namespace m66\Animals;
class Dog {}
$dog = new Dog();
var_dump(is_a($dog, 'm66\Animals\Dog')); // true
Si le nom de classe passé dynamiquement ne contient pas d'espace de noms, il entraînera une défaillance du jugement.
Si le nom de classe passé dynamiquement n'a pas encore été chargé, IS_A () reviendra également faux . Assurez-vous que les classes pertinentes ont été incluses ou chargées via l'autoader.
<?php
namespace m66\net;
class Animal {}
class Dog extends Animal {}
function checkInstance($obj, $dynamicClassName)
{
// Noms de classe dynamique standardisés
$dynamicClassName = trim($dynamicClassName);
if (!class_exists($dynamicClassName)) {
// En supposant un mécanisme de chargement automatique,Ici, il est simplifié pour lancer une erreur
throw new \Exception("Class $dynamicClassName N'existe pas");
}
return is_a($obj, $dynamicClassName);
}
$dog = new Dog();
try {
$result = checkInstance($dog, 'm66\net\Animal');
echo $result ? 'Oui Animal Ou sa sous-classe' : '不Oui Animal gentil';
} catch (\Exception $e) {
echo $e->getMessage();
}