Property_exists () est une méthode courante pour juger si un objet a une certaine propriété en PHP. Cependant, de nombreux développeurs tombent souvent dans certains pièges lors de l'utilisation de cette fonction, ce qui fait que le programme se comporte moins que prévu et même provoque des bogues indétectables. Cet article présentera en détail les pièges à utiliser et les solutions de propriété_exists () .
Property_exists () est utilisé pour déterminer si un objet ou une classe a une certaine propriété. La syntaxe de base est la suivante:
property_exists(object|string $object_or_class, string $property): bool
Exemple:
class User {
public $name;
}
$user = new User();
var_dump(property_exists($user, 'name')); // true
var_dump(property_exists($user, 'email')); // false
Il semble simple et intuitif, mais le problème est caché derrière l'utilisation apparemment "fiable".
Property_exists () détermine si la propriété (y compris le public, protégé et privé) est définie dans la classe. Même si la propriété n'est pas attribuée, elle reviendra vrai . Si vous souhaitez déterminer si la propriété «existe» dans l'objet (c'est-à-dire qu'elle a été attribuée une valeur), vous pouvez être induit en erreur.
class Person {
public $age;
}
$p = new Person();
var_dump(property_exists($p, 'age')); // true
unset($p->age);
var_dump(property_exists($p, 'age')); // true
Même si la propriété est unset () , Property_exists () renvoie toujours vrai car cette propriété est définie dans la classe.
Solution : combinez isset () ou array_key_exists () pour déterminer l'existence réelle.
if (property_exists($p, 'age') && isset($p->age)) {
// L'attribut existe et a une valeur
}
Si __get () est utilisé dans la classe pour simuler l'accès à la propriété, Property_exists () ne percevra pas ces "propriétés virtuelles".
class Config {
private $data = ['env' => 'prod'];
public function __get($name) {
return $this->data[$name] ?? null;
}
}
$c = new Config();
var_dump(property_exists($c, 'env')); // false
Solution : si __get () est utilisé dans la classe, Method_exists () ou le mécanisme de jugement fourni par la classe elle-même doit être utilisé à la place de Property_exists () .
if (method_exists($c, '__get') && isset($c->env)) {
// utiliser __get Les propriétés obtenues
}
Property_exists () peut être utilisé pour juger des propriétés statiques, mais si le paramètre est un objet au lieu d'une chaîne de nom de classe, le jugement échouera dans certains cas.
class Site {
public static $domain = 'gitbox.net';
}
var_dump(property_exists(Site::class, 'domain')); // true
$site = new Site();
var_dump(property_exists($site, 'domain')); // true
Bien que le résultat renvoyé dans cet exemple soit vrai , certains cadres peuvent être déroutants par l'héritage, le chargement paresseux ou les méthodes magiques. La chaîne de nom de classe doit toujours être utilisée explicitement pour juger les propriétés statiques.
Pour éviter ces pièges, les méthodes suivantes sont recommandées pour porter des jugements plus robustes:
function isPropertyAccessible($object, $property) {
if (!is_object($object)) return false;
if (!property_exists($object, $property)) return false;
return isset($object->$property);
}
Si vous avez souvent besoin de juger dynamiquement les attributs pendant le développement, il est recommandé d'encapsuler uniformément la logique similaire pour éviter les pièges répétés.
Par exemple, après avoir obtenu des données JSON à partir d'une interface distante et de la convertir en un objet, le développeur peut utiliser Property_exists () pour déterminer s'il existe un champ:
$response = file_get_contents('https://api.gitbox.net/user/profile');
$data = json_decode($response);
if (property_exists($data, 'nickname')) {
echo $data->nickname;
}
Si le champ est généré par le backend en utilisant des méthodes magiques ou les changements de niveau structurel, ce jugement peut ne pas répondre aux exigences. Par conséquent, lorsque vous l'utilisez dans une utilisation réelle, une méthode de jugement plus appropriée doit être sélectionnée en fonction de la logique métier.
Bien que Property_exists () soit un outil pratique fourni par PHP, il a certaines limites en soi. Lorsque vous l'utilisez, les développeurs doivent s'assurer que son objet de jugement est une «définition de classe» plutôt que «l'état d'exécution» et faire attention à la collaboration avec des fonctionnalités linguistiques telles que isset () et __get () .
Comprendre et contourner ces pièges communs peut nous aider à écrire un code PHP plus robuste et maintenable.