Dans PHP, la fonction is_a () est souvent utilisée pour déterminer si un objet appartient à une certaine classe ou à sa sous-classe. Cependant, lorsque la classe utilise un espace de noms, de nombreux développeurs constatent que le jugement IS_A () échoue souvent, ce qui entraîne des exceptions de logique de code. Cet article analysera en détail les raisons de ce phénomène et comment utiliser correctement IS_A () pour juger des classes avec des espaces de noms.
IS_A () est une fonction intégrée de PHP, avec la signature comme suit:
is_a(object|string $object_or_class, string $class_name, bool $allow_string = false): bool
Il détermine si le premier paramètre est une instance de la classe spécifiée du deuxième paramètre ou de sa sous-classe. Exemple:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true
L'introduction d'espaces de noms a changé le concept de «nom entièrement qualifié» (FQN) de la classe. Par exemple:
namespace MyApp\Models;
class User {}
À l'heure actuelle, le nom complet de la classe de la classe utilisateur est MyApp \ Models \ User , pas un simple utilisateur . Lorsque nous utilisons directement IS_A ($ obj, «utilisateur») , nous jugeons en fait si $ obj appartient à la classe d'utilisateurs sous l'espace de noms global, ce qui entraînera l'échec du jugement.
Supposons qu'il y ait le code suivant:
namespace MyApp\Models;
class User {}
$user = new User();
var_dump(is_a($user, 'User')); // false,Échec du juge
L'échec est que l'objet User $ appartient à MyApp \ Models \ User , et 'User' est l'utilisateur de l'espace de noms global, et les deux ne correspondent pas.
La bonne façon de l'écrire est de passer le nom complet de la classe:
var_dump(is_a($user, 'MyApp\Models\User')); // true
Alternativement, il est plus sûr d'utiliser :: Constantes de classe :
var_dump(is_a($user, \MyApp\Models\User::class)); // true
Si le nom de classe est passé dynamiquement, assurez-vous qu'il s'agit du nom complet de la classe ou de l'épisser dans l'espace de noms actuel:
$class = 'User';
var_dump(is_a($user, __NAMESPACE__ . '\\' . $class)); // true
is_a () Le troisième paramètre $ allow_string permet à la chaîne de nom de classe entrante de juger, sans exiger que le premier paramètre soit un objet:
var_dump(is_a('MyApp\Models\User', 'MyApp\Models\User', true)); // true
Pour le moment, le nom de classe doit également être garanti d'être complet.
L'espace de noms modifie le nom complet de la classe de la classe, résultant en le nom complet de la classe qui doit être transmis lorsque is_a () juge.
Passer dans les noms de classe sans espaces de noms entraîne généralement un échec de jugement.
L'utilisation :: Constantes de classe ou chaînes complètes est le moyen le plus recommandé.
Faites attention à la fin de l'espace de noms lors de la jugement des noms de classe dynamiques.
La maîtrise peut effectivement éviter le piège de jugement de type causée par l'espace de noms dans PHP et améliorer la robustesse et la maintenabilité du code.