is_a(object|string $object_or_class, string $class, bool $allow_string = false): bool
$ object_or_class : Kann eine Objekt- oder Klassenname -Zeichenfolge sein.
$ class : Der zu beurteilte Zielklassenname.
$ degly_string : Wenn das übergebene in eine Klassenname -Zeichenfolge anstelle eines Objekts ist, muss dieser Parameter auf true eingestellt werden.
Beispiel:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true
Sie können auch in Saiten passieren:
var_dump(is_a('Dog', 'Animal', true)); // true
$object instanceof ClassName
Beispiel:
$dog = new Dog();
var_dump($dog instanceof Animal); // true
HINWEIS: InstanceOF kann nur für Objekte verwendet werden und kann nicht direkt für Klassennamenketten verwendet werden.
Beide geben einen Booleschen Wert zurück, um festzustellen, ob das Objekt eine Instanz oder Unterklasse einer bestimmten Klasse ist. Aber:
is_a () ist entspannter und kann die Klassennamenzeichenfolge beurteilen (im Fall von $ degly_string = true ).
Instanz ist strenger und objektorientierter und kann den Namen der Klassennamen nicht beurteilen.
In den meisten Szenarien kann die Leistungslücke zwischen beiden ignoriert werden. Aus der Sicht der Sprache ist Instanz jedoch ein Bediener, der direkt auf das Objekt einwirkt und eine etwas bessere Leistung hat. Und is_a () ist eine Funktion mit einem bestimmten Aufruf -Overhead.
Wenn Sie nicht in einer sehr häufigen Schleife Typ -Urteile ausführen, müssen Sie dem nicht zu viel Aufmerksamkeit schenken.
IS_A () war eine ähnliche interne Funktion vor PHP 5 und unterstützte die aktuelle Form seit Php 5 offiziell.
Instanceof ist ein Sprachbetreiber und wurde stabil zur Unterstützung.
Wenn Sie Ihren Code mit früheren Versionen kompatibel machen oder Funktionsaufrufe (wie Funktionsüberschreibungen, Mocke usw.) vermeiden müssen, ist die Instanz von zuverlässiger.
Wenn is_a () Urteile mit dem vom Benutzer bereitgestellten Klassennamen fällt, kann IS_A () leicht missbraucht werden. Zum Beispiel:
$class = $_GET['class']; // Benutzer können in jedem Klassennamen weitergeben
if (is_a($object, $class)) {
// ...
}
Diese Art des dynamischen Urteils hat bestimmte Sicherheitsrisiken. Die Verwendung von Instanzen kann bessere Strukturen einschränken und mögliche Injektionen oder Fehleinschätzungen vermeiden.
Aus folgenden Gründen wird empfohlen, zuerst Instanzen von zuerst zu verwenden:
Semantischer und im Einklang mit dem objektorientierten Programmierstil.
Weniger Fehlerrisiko, Logik für die Logik der Lähmung.
Etwas ausgezeichnete Leistung und einfacher Ausdruck.
Wenn einige Personen in den Unterrichtsnamen dynamisch übergeben müssen (z. B. Fabrikmodus, Plug-in-Mechanismus), kann IS_A () verwendet werden, aber explizit $ degly_string = true einstellen und sicherstellen, dass die in den Klassennamen übergegebenen und vertrauenswürdigen Bestätigungsnamen.
Zum Beispiel:
$class = 'App\\Plugins\\SomeHandler';
if (is_a($handler, $class, true)) {
$handler->handle();
}
Referenzdynamic Plugin Management Beispielcode gehostet in:
https://m66.net/examples/plugin-loader.php