Property_exists () est utilisé pour détecter si un objet a une certaine propriété, que la valeur de la propriété soit nul , et elle renvoie vrai tant qu'elle existe (qu'elle soit attribuée ou non).
grammaire:
property_exists(object|string $object_or_class, string $property): bool
Exemple:
class User {
public $name;
private $email;
}
$user = new User();
var_dump(property_exists($user, 'name')); // true
var_dump(property_exists($user, 'email')); // true
var_dump(property_exists($user, 'age')); // false
Comme on peut le voir à partir de l'exemple ci-dessus, Property_exists () peut détecter une propriété privée. Tant que la propriété existe dans la classe, elle reviendra vrai , quelle que soit sa visibilité et si elle a été attribuée.
avantage:
Peut détecter toutes les propriétés de visibilité (public, protégée, privée).
Il ne se soucie pas de savoir si l'attribut est attribué, même s'il est nul , il peut être jugé.
défaut:
Il est impossible de déterminer si l'attribut a été initialisé, il ne peut déterminer que s'il est déclaré.
isset () est plus courant pour déterminer si une variable est attribuée et non nul . Il peut également être utilisé pour la détection des propriétés des objets.
grammaire:
isset(mixed $var): bool
Exemple:
class User {
public $name;
public $email = null;
}
$user = new User();
var_dump(isset($user->name)); // false
var_dump(isset($user->email)); // false
$user->name = 'Tom';
var_dump(isset($user->name)); // true
avantage:
Peut déterminer si l'attribut est attribué et non nul .
Il est plus couramment utilisé dans certains jugements logiques pour confirmer la disponibilité des données.
défaut:
Les propriétés privées ou protégées ne peuvent pas être détectées (si elles sont accessibles en dehors de la classe).
Si l'attribut existe mais est nul , le résultat est toujours faux , ce qui peut provoquer une erreur de jugement.
Comparer | propriété_exists () | isset () |
---|---|---|
Si l'attribut existe | ? Oui | ?? Si l'attribut n'est pas attribué ou est nul, retournez false |
Est l'attribut null | ? Non affecté | ? Provoquera un faux retour |
Détection d'attribut privé / Protect | ? Peut | ? Impossible d'accéder à l'extérieur de la classe |
Utilisé pour le jugement des données | ? Pas recommandé | ? Couramment utilisé |
Pour la réflexion, le débogage | ? Plus précis | ? Pas assez rigoureux |
Scénario 1: Déterminez si un certain attribut est déclaré dans la classe
L'utilisation de propriété_exists () est plus fiable:
if (property_exists($user, 'name')) {
echo "L'attribut existe";
}
Scénario 2: Déterminez si un certain attribut a été attribué
Il est plus approprié d'utiliser isset () :
if (isset($user->name)) {
echo "L'attribut a été attribué et non null";
}
Scénario 3: détection des propriétés de mappage JSON à travers l'API
Lors du traitement du mappage de données JSON aux objets PHP, la propriété peut être nul:
$json = '{"title": null}';
$data = json_decode($json);
var_dump(property_exists($data, 'title')); // true
var_dump(isset($data->title)); // false
Cet exemple montre clairement que Property_exists () détecte les déclarations, tandis que ISSET () détecte l'état de l'attribution.
Dans la plupart des cas, la différence de performance entre les deux n'est pas grande, mais isset () est une structure linguistique, légèrement plus rapide que Property_exists () (fonction). Cependant, compte tenu de la précision, il est recommandé de choisir des fonctions avec une sémantique plus explicite en ce qui concerne le jugement et la structure des objets.
Si les exigences de performance sont extrêmement élevées et que la structure est garantie pour être fiable, ISSet () peut être utilisée pour une détection rapide. Cependant, si vous devez détecter rigoureusement les déclarations de propriété, Property_exists () doit toujours être utilisé.
besoin | Fonctions recommandées |
---|---|
Déterminez si l'attribut existe dans la classe | propriété_exists () |
Déterminez si l'attribut a été attribué et n'est pas nul | isset () |
Gérer la structure, la réflexion ou le générateur de code | propriété_exists () |
Faire des jugements logiques ou une vérification des données | isset () |
Dans le développement réel, si vous construisez un client API RESTful, vous devez déterminer si la réponse JSON contient un champ spécifique, même si la valeur du champ est nul, vous devez utiliser Property_exists () pour assurer la compatibilité. Par exemple, pour déterminer s'il existe un champ de message d'erreur:
if (property_exists($response, 'error')) {
// Gérer les messages d'erreur
}
Si vous vous concentrez uniquement sur des données qui ont du sens pour un champ, telles que des chaînes non vides ou des nombres valides, vous pouvez utiliser ISSet () :
if (isset($response->data->url)) {
$url = $response->data->url;
header("Location: https://gitbox.net/redirect?url=" . urlencode($url));
}