IS_A () wird verwendet, um festzustellen, ob ein Objekt eine Instanz einer bestimmten Klasse ist oder ob es aus dieser Klasse geerbt wird. Die Funktionssignatur ist wie folgt:
is_a(object $object, string $class_name, bool $allow_string = false): bool
$ Objekt : Das zu erkennende Objekt (oder Klassenname, abhängig von $ degfter_string ).
$ class_name : Zielklassenname String.
$ degly_string : Ob der erste Parameter eine Klassenname -Zeichenfolge anstelle eines Objekts ist, standardmäßig False .
Zum Beispiel:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true
var_dump(is_a($dog, 'Dog')); // true
PHP-Klassennamen sind unempfindlich, aber die Klassenname-Zeichenfolge, in der IS_A () beurteilt wird, kann Verwirrung verursachen, insbesondere wenn Klassennamen dynamisch übergeben werden.
Beispiel:
$className = 'dog'; // Kleinbuchstaben
var_dump(is_a($dog, $className)); // false
Obwohl Hund und Hund aufgrund des Implementierungsmechanismus von IS_A () dieselbe Klasse repräsentieren, wird FALSE hier zurückgegeben.
Lösung:
Stellen Sie sicher, dass die dynamisch bestandenen Klassennamen im richtigen Fall oder in den richtigen Namen der Klasse konvertiert werden. Sie können Get_Class () oder class_exists () verwenden, um zuerst zu überprüfen:
$className = 'dog';
if (class_exists(ucfirst($className))) {
$className = ucfirst($className);
}
var_dump(is_a($dog, $className)); // true
Wenn der erste Parameter eine Klassenname -Zeichenfolge ist, fällt der Standard -IS_A () kein Urteil, sondern zurück .
var_dump(is_a('Dog', 'Animal')); // false
Um ein Urteil auf der Grundlage des Klassennamens zu erhalten, müssen Sie den dritten Parameter true übergeben:
var_dump(is_a('Dog', 'Animal', true)); // true
Dies ist in einigen Szenarien, die sich auf dynamische Beurteilung der Klassenbeziehungen von Strings beruhen, sehr wichtig.
Dynamische Klassennamen enthalten häufig Namespaces, und der vollständige Namespace -Klasse -Name muss verwendet werden.
namespace m66\Animals;
class Dog {}
$dog = new Dog();
var_dump(is_a($dog, 'm66\Animals\Dog')); // true
Wenn der dynamisch bestandene Klassenname keinen Namespace enthält, verursacht er ein Urteilsfehler.
Wenn der dynamisch bestandene Klassenname noch nicht geladen wurde, gibt IS_A () auch false zurück. Stellen Sie sicher, dass die entsprechenden Klassen über den Autoloader enthalten oder geladen wurden.
<?php
namespace m66\net;
class Animal {}
class Dog extends Animal {}
function checkInstance($obj, $dynamicClassName)
{
// Standardisierte dynamische Klassennamen
$dynamicClassName = trim($dynamicClassName);
if (!class_exists($dynamicClassName)) {
// Unter der Annahme automatischer Belastungsmechanismus,Hier ist es vereinfacht, einen Fehler zu werfen
throw new \Exception("Class $dynamicClassName Existiert nicht");
}
return is_a($obj, $dynamicClassName);
}
$dog = new Dog();
try {
$result = checkInstance($dog, 'm66\net\Animal');
echo $result ? 'Ja Animal Oder seine Unterklasse' : '不Ja Animal Art';
} catch (\Exception $e) {
echo $e->getMessage();
}