In PHP wird die Funktion is_a () häufig verwendet, um festzustellen, ob ein Objekt zu einer bestimmten Klasse oder seiner Unterklasse gehört. Wenn die Klasse jedoch einen Namespace verwendet, stellen viele Entwickler fest, dass das IS_A () -Regel häufig fehlschlägt, was zu Ausnahmen von Codelogik führt. In diesem Artikel wird die Gründe für dieses Phänomen ausführlich analysiert und wie man IS_A () korrekt verwendet, um Klassen mit Namespaces zu beurteilen.
is_a () ist eine integrierte Funktion von PHP mit der Signatur wie folgt:
is_a(object|string $object_or_class, string $class_name, bool $allow_string = false): bool
Es bestimmt, ob der erste Parameter eine Instanz der angegebenen Klasse des zweiten Parameters oder seiner Unterklasse ist. Beispiel:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true
Die Einführung von Namespaces hat das Konzept des "vollständig qualifizierten Namens" (FQN) der Klasse geändert. Zum Beispiel:
namespace MyApp\Models;
class User {}
Zu diesem Zeitpunkt lautet der vollständige Klassenname der Benutzerklasse MyApp \ Models \ Benutzer , kein einfacher Benutzer . Wenn wir IS_A ($ obj, 'user') direkt verwenden, beurteilen wir tatsächlich, ob $ obj zur Benutzerklasse unter dem globalen Namespace gehört, was dazu führt, dass das Urteil fehlschlägt.
Angenommen, es gibt den folgenden Code:
namespace MyApp\Models;
class User {}
$user = new User();
var_dump(is_a($user, 'User')); // false,Versäumte es zu beurteilen
Der Fehler ist, dass das $ User -Objekt zu MyApp \ Models \ Benutzer gehört und 'Benutzer' der Benutzer des globalen Namespace ist und die beiden nicht übereinstimmen.
Die richtige Art, es zu schreiben, besteht darin, den vollständigen Klassennamen zu übergeben:
var_dump(is_a($user, 'MyApp\Models\User')); // true
Alternativ ist es sicherer zu verwenden :: Klassenkonstanten :
var_dump(is_a($user, \MyApp\Models\User::class)); // true
Wenn der Klassenname dynamisch übergeben wird, stellen Sie sicher, dass es sich um den vollständigen Klassennamen handelt, oder spleifen Sie ihn im aktuellen Namespace:
$class = 'User';
var_dump(is_a($user, __NAMESPACE__ . '\\' . $class)); // true
IS_A () Der dritte Parameter $ degly_string ermöglicht es der eingehenden Klassennamenzeichenfolge zu beurteilen, ohne zu verlangen, dass der erste Parameter ein Objekt sein muss:
var_dump(is_a('MyApp\Models\User', 'MyApp\Models\User', true)); // true
Zu diesem Zeitpunkt muss auch der Unterrichtsname garantiert abgeschlossen sein.
Der Namespace ändert den vollständigen Klassennamen der Klasse und führt zu dem vollständigen Klassennamen, der übergeben werden muss, wenn is_a () beurteilt wird.
Das Übergeben von Klassennamen ohne Namespaces führt normalerweise zu einem Beurteilungsunternehmen.
Die Verwendung von :: Klassenkonstanten oder vollständige Zeichenfolgen ist die empfohlene Art und Weise.
Achten Sie darauf, den Namespace zu vervollständigen, wenn dynamische Klassennamen beurteilt werden.
Wenn Sie dies beherrschen, können Sie die durch den Namenspace in PHP verursachte Typurteilsfalle effektiv vermeiden und die Robustheit und Wartbarkeit des Codes verbessern.