In der programmorientierten PHP-programmierten PHP-Programmierung müssen wir häufig feststellen, ob ein Objekt eine Instanz einer bestimmten Klasse ist oder ob es von einer bestimmten Klasse erbt. Die Funktion is_a () wird dafür geboren. Es bietet eine kurze Möglichkeit, die Beziehung zwischen Objekten und Klassen zu beurteilen. Es ist eines der wichtigsten Instrumente zur Implementierung von Polymorphismus und Typprüfungen.
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.
$ class : Der Klassenname zu vergleichen.
$ degly_string : Ob die Klassenname -Zeichenfolge als erster Parameter zuzulassen, falls wahr , kann der Klassenname -String übergeben und nicht auf Objekte beschränkt sein.
Die Funktion gibt treu zurück, um anzuzeigen, dass das Objekt zur Klasse oder einer Unterklasse der Klasse gehört, und wenn es false zurückgibt, ist dies nicht der Fall.
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
if (is_a($dog, 'Animal')) {
echo "Dieses Objekt ist Animal Beispiele für Klasse,或其子Beispiele für Klasse。";
} else {
echo "Dieses Objekt ist nicht Animal Beispiele für Klasse。";
}
Ausgangsergebnis:
Dieses Objekt ist Animal Beispiele für Klasse,或其子Beispiele für Klasse。
In diesem Beispiel ist Hund eine Unterklasse von Tier , daher wird $ Dog auch als Objekt vom Typ Tier angesehen.
Manchmal, wenn wir Frameworks- oder Prozesskonfigurationsdateien verwenden, erhalten wir möglicherweise Klassennamen -Zeichenfolgen anstelle von tatsächlichen Objekten. Zu diesem Zeitpunkt kann das Urteil erreicht werden, indem der dritte Parameter von IS_A () auf true festgelegt wird.
class User {}
$className = 'User';
if (is_a($className, 'User', true)) {
echo "Saite '$className' Der dargelegte Klassenname ist User Oder seine Unterklasse。";
}
Diese Methode ist sehr nützlich bei der automatischen Belastung von Klassen, Abhängigkeitsinjektion oder Fabrikmodi und kann das Problem des manuellen Instanziierens von Objekten effektiv vermeiden, um den Typ zu bestimmen.
IS_A () und Instanz der Operatoren sind in der Funktionalität etwas ähnlich, aber es gibt auch die folgenden Unterschiede:
Instanz ist ein Operator und kann nicht in eine Klassennamenzeichenfolge übergeben werden.
IS_A () ist eine Funktion, die ein Objekt oder eine String- und Steuerverhalten über einen dritten Parameter übergeben kann.
IS_A () ist etwas weniger lesbar als Instanz , hat aber mehr Flexibilität.
Beispielvergleich:
if ($dog instanceof Animal) {
// verwenden instanceof Richtertyp
}
if (is_a($dog, 'Animal')) {
// verwenden is_a() Richtertyp
}
Wenn Sie nur Objekte verarbeiten, wird empfohlen, InstanceOF zu verwenden. Wenn Sie das String -Urteil unterstützen müssen, sollten Sie IS_A () verwenden.
Bestimmen Sie die Vererbungsbeziehung der Klasse im automatischen Belastungsmechanismus
$className = 'App\\Service\\UserService';
if (is_a($className, 'App\\Core\\BaseService', true)) {
// Diese Klasse ist eine Unterklasse einer grundlegenden Dienstklasse,Kann initialisiert oder registriert werden
}
Rechtskategorien im Fabrikmodell
function createService($className) {
if (!is_a($className, 'App\\Service\\BaseService', true)) {
throw new Exception("Illegale Dienste:$className");
}
return new $className();
}
Beurteilen Sie die Implementierung der Plug-in-Schnittstelle im Plug-in-System
foreach ($pluginList as $pluginClass) {
if (is_a($pluginClass, 'PluginInterface', true)) {
$plugin = new $pluginClass();
$plugin->run();
}
}
In PHP 5.3 und danach wurden die Leistung und Stabilität der IS_A () -Funktion verbessert, sodass Sie sie mit Zuversicht verwenden können.
Der übergebene Klassenname muss existieren, sonst wird ein Fehler geworfen. Wenn Sie nicht sicher sind, ob die Klasse definiert ist, können Sie sie mit class_exists () verwenden.
if (class_exists($className) && is_a($className, 'SomeBaseClass', true)) {
// Sicherheitsurteil
}
IS_A () ist eine praktische Funktion in PHP, um die Klasse zu bestimmen, zu der das Objekt gehört, insbesondere wenn es notwendig ist, Typ -Urteile durch Zeichenfolgen zu fällen. Durch die ordnungsgemäße Verwendung von IS_A () kann Ihr Code flexibler und skalierbarer gemacht werden, insbesondere für Architekturen wie objektorientierte komplexe Systeme, Plug-in-Mechanismen und Servicebehälter.