In PHP wird die Funktion is_a () häufig verwendet, um festzustellen, ob ein Objekt zu einer bestimmten Klasse oder seiner Unterklasse gehört. Dies ist sehr nützlich bei der Typ-Prüfung und der objektorientierten Programmierung. Wenn jedoch eine anonyme Klasse beteiligt ist, kann das Verhalten von IS_A () einige unerwartete "Gruben" haben, was zu Fehlern zur Codeurteilung und zur Auswirkung der Programmlogik führt.
In diesem Artikel werden bestimmte Fälle kombiniert, um die Probleme, die bei der Beurteilung anonymer Klassen mit IS_A () auftreten können, tief analysieren und eine angemessene Lösung bereitstellen.
Die Syntax der Funktion is_a () lautet wie folgt:
is_a(object|string $object_or_class, string $class_name, bool $allow_string = false): bool
Es wird verwendet, um festzustellen, ob $ Object_or_class eine Instanz oder Unterklasse von $ class_name ist.
Ein einfaches Beispiel geben:
class Foo {}
$obj = new Foo();
var_dump(is_a($obj, 'Foo')); // true
Das ist sehr intuitiv.
Anonyme Klassen sind Klassen, die zur Laufzeit dynamisch definiert sind, ohne explizite Klassennamen. Zum Beispiel:
$anon = new class {
public function sayHello() {
return "Hello";
}
};
Der anonymen Klasse wird als interner Name wie class@anonymous/path/to/File.php: Zeile von PHP zugewiesen, aber dieser Name ist unvorhersehbar und kann nicht direkt als Typ -Urteil verwendet werden.
Angenommen, wir haben den folgenden Code:
class Base {}
$anon = new class extends Base {};
var_dump(is_a($anon, 'Base')); // Ausgabe true
var_dump(is_a($anon, 'class@anonymous')); // Ausgabe false,Der interne Name der anonymen Klasse kann nicht erkannt werden
Wenn Sie den internen Namen einer anonymen Klasse direkt verwenden, um Urteile zu fällen, ist es schwierig, korrekt zu entsprechen, da der Name dynamisch ist und Pfade und Zeilennummern enthält.
Der Name der anonymen Klasse enthält die Dateipfad und die Zeilennummer, wie z. B.:
class@anonymous /path/to/file.php:10
Dies macht es uns unmöglich, anonyme Klassennamen hardcode zu urteilen.
Der zweite Parameter von is_a () muss der Klassenname des Zeichenfolge -Typs sein, aber der anonyme Klassenname ist nicht behoben und schwierig zu referenzieren.
Obwohl anonyme Klassen andere Klassen erben können, ist das Erbschaftsurteil von IS_A () über die Instanz gültig. Wenn der Code den anonymen Klassennamen mit dem Namen der Zeichenfolgeklassen hardcodes hardcodes, fehlschlägt das Urteil unweigerlich.
Da anonyme Klassen eine bestimmte Klasse erben, beurteilen wir normalerweise, ob das Objekt eine Instanz der übergeordneten Klasse ist:
var_dump(is_a($anon, Base::class)); // true
Dies ist auch der einfachste und empfohlene Weg, dies zu tun.
Definieren Sie die Schnittstelle und ermöglichen Sie die anonyme Klasse, sie zu implementieren, damit das Urteil über den Schnittstellentyp klarer ist:
interface SayHelloInterface {
public function sayHello();
}
$anon = new class implements SayHelloInterface {
public function sayHello() {
return "Hello";
}
};
var_dump(is_a($anon, SayHelloInterface::class)); // true
Wenn es sich nicht um ein besonderes Bedürfnis handelt, sollte der Code vermeiden, den "echten Klassennamen" der anonymen Klassen zu beurteilen, sondern stattdessen Typ -Urteile über die übergeordnete Klasse oder Schnittstelle abzugeben.
<?php
class Base {
public function who() {
return "I am Base";
}
}
interface GreetInterface {
public function greet(): string;
}
// Anonymer Erbschaft Base
$anon1 = new class extends Base {
public function who() {
return "I am Anonymous extending Base";
}
};
// Anonyme Klasse implementiert die Schnittstelle
$anon2 = new class implements GreetInterface {
public function greet(): string {
return "Hello from anonymous";
}
};
echo is_a($anon1, Base::class) ? "anon1 is Base\n" : "anon1 is NOT Base\n";
echo is_a($anon2, GreetInterface::class) ? "anon2 implements GreetInterface\n" : "anon2 does NOT implement GreetInterface\n";
// Fehlerdemonstration:Beurteilen Sie den internen Namen der anonymen Klasse direkt(Nicht verfügbar)
$className = get_class($anon1);
echo "Class name of anon1: $className\n";
var_dump(is_a($anon1, $className)); // true, Aber $className Nicht für hartcodiertes Urteilsvermögen geeignet
Der Klassenname einer anonymen Klasse wird dynamisch mit einer Pfad- und Zeilennummer generiert und kann nicht direkt als Grundlage für das Urteilsvermögen verwendet werden.
Wenn IS_A () bestimmt, ob eine anonyme Klasseninstanz eine Instanz einer bestimmten Elternklasse oder Schnittstelle ist, ist das Beurteilung der Erbschaftsbeziehung normal und gültig.
Es wird empfohlen, den Objekttyp über die übergeordnete Klasse oder Schnittstelle zu beurteilen, um zu vermeiden, dass sich direkt auf die anonyme Klasse "Real Class Name" stützt.
Der auf diese Weise geschriebene Code ist robuster und entspricht dem Prinzip des objektorientierten Designs.
Wenn Sie das Urteil über anonyme Klassen in Ihren Code einbeziehen, können die oben genannten "Gruben" und Lösungen viele unnötige Debugging und Fehler vermeiden. Ich hoffe, dieser Artikel wird für Sie hilfreich sein, um PHP anonyme Klassen und IS_A () zu verstehen!