En PHP, nous devons souvent taper vérifier les propriétés d'un objet pour nous assurer qu'il n'y a pas d'erreur de type lors de l'accès ou de la manipulation des propriétés au moment de l'exécution. Bien que PHP soit un langage dynamique, juger avec précision si les attributs existent et leurs types lors de l'interaction avec des objets ou des interfaces complexes est toujours un moyen important pour assurer la robustesse du code.
Cet article présentera comment utiliser Property_exists () et get_class () pour juger avec précision l'existence et des types spécifiques de propriétés d'objet.
Supposons que vous développez un système commercial qui s'appuie sur des structures d'objets polymorphes, et différents types d'objets peuvent avoir le même nom mais différents types de propriétés. Par exemple:
class User {
public Profile $profile;
}
class Admin {
public AdminProfile $profile;
}
class Guest {
// Non profile propriété
}
Vous souhaitez passer dans n'importe quel objet et déterminer s'il a un attribut de profil et le nom de classe spécifique de l'attribut sans casser la sécurité de type.
Property_exists () est une fonction intégrée PHP qui nous permet de détecter si une propriété existe dans un objet ou une classe. La syntaxe est la suivante:
bool property_exists(object|string $object_or_class, string $property)
Exemple:
if (property_exists($object, 'profile')) {
// Défini dans l'objet de description profile propriété
}
Mais notez qu'il ne juge pas si la propriété a été initialisée, seulement si elle est déclarée.
Une fois que nous confirmons que l'objet a cette propriété, nous pouvons essayer d'obtenir sa valeur et utiliser get_class () pour déterminer le type spécifique de la valeur.
if (property_exists($object, 'profile')) {
$profileValue = $object->profile;
if (is_object($profileValue)) {
$profileClass = get_class($profileValue);
echo "propriété profile Le type de: $profileClass";
} else {
echo "propriété profile exister,Mais pas l'objet。";
}
}
Voici une fonction pratique qui accepte des objets arbitraires et essaie de déterminer s'ils ont spécifié les attributs et sorti le nom de la classe de l'attribut:
function getObjectPropertyClass(object $object, string $property): ?string {
if (property_exists($object, $property)) {
$value = $object->$property ?? null;
if (is_object($value)) {
return get_class($value);
}
}
return null;
}
Exemple d'utilisation:
$user = new User();
$user->profile = new Profile();
$className = getObjectPropertyClass($user, 'profile');
if ($className) {
echo "profile Le nom de classe est:$className";
} else {
echo "该propriété不exister或不是对象。";
}
Dans PHP 7.4+, si la propriété est tapée et non attribuée, l'accès à lui lance directement une erreur. Vous pouvez utiliser ReflectionProperty pour déterminer gracieusement si la propriété a été initialisée.
function isPropertyInitialized(object $object, string $property): bool {
try {
$ref = new ReflectionProperty($object, $property);
return $ref->isInitialized($object);
} catch (ReflectionException $e) {
return false;
}
}
Utilisation en combinaison:
if (property_exists($object, 'profile') && isPropertyInitialized($object, 'profile')) {
$profile = $object->profile;
if (is_object($profile)) {
echo "Type est:" . get_class($profile);
}
}
Par exemple, lorsque vous traitez un objet de données renvoyé à partir d'une API distante (par exemple, https://api.gitbox.net/users/123 ), vous pouvez utiliser la méthode ci-dessus pour déterminer dynamiquement s'il contient des propriétés telles que le profil et les paramètres , et les traiter davantage.
Cette approche est idéale pour désérialiser ou traiter les interfaces de données qui ne sont pas des structures d'objets standardisées.
Combinant Property_exists () et get_class () , combinée à l'utilisation avancée de ReflectionProperty , nous pouvons juger plus en toute sécurité et avec précision l'existence des propriétés d'objet et leurs types spécifiques en PHP. Cette approche convient particulièrement aux scénarios de programmation liés à la conception basée sur les données, au traitement de la réponse d'interface ou à la réflexion. Il a une valeur très pratique pour améliorer la robustesse et la maintenabilité du code.