bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
$ object_or_class : Der zu überprüfen von Objekt oder Klassenname (wenn $ degly_string = true festgelegt ist).
$ class : Der zu verglichene Zielklassenname.
$ degit_string : Ob die eingehende Klassenname -Zeichenfolge als erster Parameter zuzulassen (Standard False , nur von PHP 5.3.9+ unterstützt).
Die Funktion gibt einen booleschen Wert zurück: true , wenn $ object_or_class eine Instanz der $ Class -Klasse oder seiner Unterklasse ist. Ansonsten falsch .
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
if (is_a($dog, 'Animal')) {
echo "Ja Animal Eine Instanz einer Klasse oder ihrer Unterklasse";
} else {
echo "不Ja Animal Eine Instanz einer Klasse oder ihrer Unterklasse";
}
Ausgabe:
Ja Animal Eine Instanz einer Klasse oder ihrer Unterklasse
Obwohl $ Dog eine Instanz des Hundes ist, weil Hunde Animal erbt, wird is_a () wahr zurückkehren.
Manchmal haben wir möglicherweise nur Klassennamen anstelle von Instanzobjekten. Sie können die Vererbungsbeziehung zwischen den Klassen bestimmen, indem Sie den dritten Parameter $ degly_string = true festlegen.
class Animal {}
class Cat extends Animal {}
$className = 'Cat';
if (is_a($className, 'Animal', true)) {
echo "$className Ja Animal Unterklasse oder sich selbst";
}
Dies ist sehr nützlich, wenn es um dynamische Klassennamen wie Reflexion oder Abhängigkeitsinjektion geht.
Angenommen, wir haben mehrere Prozessorklassen in einem Content -Management -System, wobei jede Klasse einen abstrakten Basepresor der Klasse erbt. Wir möchten bestätigen, ob die aktuell geladene Prozessorklasse vor dem Ausführen konform ist.
abstract class BaseProcessor {
abstract public function process();
}
class MarkdownProcessor extends BaseProcessor {
public function process() {
// bewältigen Markdown Inhalt
}
}
function runProcessor($processor) {
if (!is_a($processor, 'BaseProcessor')) {
throw new Exception("无效bewältigen器!");
}
$processor->process();
}
$proc = new MarkdownProcessor();
runProcessor($proc);
Wenn es sich bei dem Eingabedohrung um ein Objekt handelt, das den Basepressor nicht erbt, wird das System eine Ausnahme ausgelöst, um Laufzeitfehler zu vermeiden.
Es gibt auch eine Operatorinstanz in PHP, mit der auch ähnliche Urteile fällen können. Was ist der Unterschied zwischen IS_A () und Instanz von ?
Vergleichen | is_a () | Instanz |
---|---|---|
Typ | Funktion | Operator |
Saiten zulassen | Ja (der dritte Parameter muss wahr sein) | NEIN |
Lesbarkeit | Besser (mehr Logik) | Häufiger verwendet, präzise Grammatik |
Versionsunterstützung | PHP 4+, PHP 5.3.9+ unterstützt String -Urteilsvermögen | PHP 5+ |
Wenn es sich um eine Objektinstanzbeurteilung handelt, ist es häufiger, Instanz zu verwenden. Und für Fälle, in denen es notwendig ist, die Klassennamenzeichenfolge zu beurteilen, ist IS_A () besser geeignet.
Leistungsprobleme : IS_A () ist eine Reflexionsoperation am Boden, die etwas langsamer als ein Beispiel ist, aber die Lücke ist extrem klein, es sei denn, es ist im Allgemeinen nicht erforderlich, sie bei hochfrequenten Aufrufen zu berücksichtigen.
Unabhängig davon, ob die Klasse vorhanden ist : Vor der Verwendung von IS_A () stellen Sie sicher, dass die Zielklasse vorliegt, andernfalls kann ein Fehler angesprochen werden. Sie können Class_Exists () verwenden, um das Urteil zuerst zu fällen.
PSR -Spezifikation und Designideen : Die rationale Verwendung von IS_A () kann die Sicherheit der Typ verbessern, aber übermäßige Abhängigkeit kann auch gegen das Prinzip der Offenheit und des Schließens verstoßen. Es wird empfohlen, es mit der Schnittstelle zu verwenden.