bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
$ object_or_class : le nom de l'objet ou de la classe à vérifier (si $ allow_string = true est défini).
$ Classe : le nom de la classe cible à comparer.
$ allow_string : s'il faut autoriser la chaîne de nom de classe entrante comme le premier paramètre (par défaut faux , pris en charge uniquement par PHP 5.3.9+).
La fonction renvoie une valeur booléenne: true if $ object_or_class est une instance de classe $ class ou sa sous-classe; Sinon, faux .
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
if (is_a($dog, 'Animal')) {
echo "Oui Animal Une instance d'une classe ou de sa sous-classe";
} else {
echo "不Oui Animal Une instance d'une classe ou de sa sous-classe";
}
Sortir:
Oui Animal Une instance d'une classe ou de sa sous-classe
Dans cet exemple, bien que $ dog soit un exemple de chien , car le chien hérite de l'animal , IS_A () reviendra vrai .
Parfois, nous pouvons n'avoir que des chaînes de nom de classe au lieu d'objets d'instance. Vous pouvez déterminer la relation d'héritage entre les classes en définissant le troisième paramètre $ allow_string = true .
class Animal {}
class Cat extends Animal {}
$className = 'Cat';
if (is_a($className, 'Animal', true)) {
echo "$className Oui Animal sous-classe ou lui-même";
}
Ceci est très utile lors de la gestion de noms de classe dynamiques tels que la réflexion ou l'injection de dépendance.
Supposons que nous ayons plusieurs classes de processeurs dans un système de gestion de contenu, chaque classe hérite d'une classe abstraite Baseprocessor . Nous voulons confirmer si la classe de processeur actuellement chargée est conforme avant l'exécution.
abstract class BaseProcessor {
abstract public function process();
}
class MarkdownProcessor extends BaseProcessor {
public function process() {
// traiter avec Markdown contenu
}
}
function runProcessor($processor) {
if (!is_a($processor, 'BaseProcessor')) {
throw new Exception("无效traiter avec器!");
}
$processor->process();
}
$proc = new MarkdownProcessor();
runProcessor($proc);
Si l'objet passé est un objet qui n'hérite pas du baséprocesseur , le système lancera une exception pour éviter les erreurs d'exécution.
Il existe également une instance d'opérateur en PHP, qui peut également être utilisée pour porter des jugements similaires. Alors, quelle est la différence entre IS_A () et InstructionOf ?
Comparer | is_a () | instance de |
---|---|---|
taper | fonction | Opérateur |
Autoriser les cordes | Oui (le troisième paramètre doit être vrai) | Non |
lisibilité | Mieux (plus logique) | Plus couramment utilisé, grammaire concise |
Prise en charge de la version | PHP 4+, PHP 5.3.9+ prend en charge le jugement des cordes | Php 5+ |
Dans le développement réel, s'il s'agit d'un jugement d'instance d'objet, il est plus courant d'utiliser l'instance OFF ; Et pour les cas où il est nécessaire de juger la chaîne de nom de classe, IS_A () est plus approprié.
Problèmes de performances : IS_A () est une opération de réflexion en bas, ce qui est légèrement plus lent que l'instance , mais l'écart est extrêmement faible, sauf s'il n'est généralement pas nécessaire de le considérer dans les appels à haute fréquence.
Que la classe existe : avant d'utiliser IS_A () , assurez-vous que la classe cible existe, sinon une erreur peut être augmentée. Vous pouvez utiliser class_exists () pour rendre le jugement en premier.
Spécification PSR et idées de conception : L'utilisation rationnelle de IS_A () peut améliorer la sécurité du type, mais une dépendance excessive peut également violer le principe de l'ouverture et de la fermeture. Il est recommandé de l'utiliser avec l'interface.