186 votes

Meilleur moyen de tester l'existence d'une variable en PHP; isset () est clairement cassé

De la isset() docs:

isset() will return FALSE if testing a variable that has been set to NULL.

Fondamentalement, isset() ne pas vérifier si la variable est définie, mais si elle est définie à rien, mais NULL.

Étant donné que, quelle est la meilleure façon de vérifier l'existence d'une variable? J'ai essayé quelque chose comme:

if(isset($v) || @is_null($v))

( @ est nécessaire pour éviter l'avertissement lors de l' $v n'est pas défini), mais is_null() a un problème similaire à l' isset(): elle retourne TRUE sur les unset les variables! Il apparaît également que:

@($v === NULL)

fonctionne exactement comme @is_null($v), de sorte que c'est, trop.

Comment sommes-nous censés fiable de vérifier l'existence d'une variable en PHP?


Edit: il y a clairement une différence en PHP entre les variables ne sont pas définies, et les variables qui sont définies à l' NULL:

<?php
$a = array('b' => NULL);
var_dump($a);

PHP montre qu' $a['b'] existe, et il a un NULL de la valeur. Si vous ajoutez:

var_dump(isset($a['b']));
var_dump(isset($a['c']));

vous pouvez voir l'ambiguïté je suis en train de parler avec l' isset() fonction. Voici la sortie de ces trois var_dump()s:

array(1) {
  ["b"]=>
  NULL
}
bool(false)
bool(false)


En outre edit: deux choses.

L'un, un cas d'utilisation. Un tableau de devenir les données de SQL UPDATE déclaration, où la matrice de touches sont les colonnes du tableau, et le tableau de valeurs sont les valeurs de chaque colonne. Toutes les colonnes de la table peut contenir un NULL de la valeur, comme en témoigne le passage d'un NULL de la valeur dans le tableau. Vous avez besoin d' un moyen de différencier entre un tableau clé n'existe pas, et un tableau de la valeur définie à l' NULL; c'est la différence entre ne pas mettre à jour la valeur de la colonne et de la mise à jour de la valeur de la colonne d' NULL.

Deuxièmement, Zoredache réponse, array_key_exists() fonctionne correctement, pour mon ci-dessus, ainsi que pour toutes les variables globales:

<?php
$a = NULL;
var_dump(array_key_exists('a', $GLOBALS));
var_dump(array_key_exists('b', $GLOBALS));

sorties:

bool(true)
bool(false)

Depuis qui gère correctement à peu près partout, je peux voir qu'il y ait aucune ambiguïté entre les variables qui n'existent pas et les variables qui sont définies à l' NULL, je suis appelant array_key_exists() l'officiel de la façon la plus simple en PHP pour vraiment vérifier l'existence d'une variable.

(Seulement les autres cas, je pense, pour les propriétés de la classe, pour laquelle il n'y a property_exists(), qui, selon ses docs, fonctionne de façon similaire à l' array_key_exists() en ce qu'elle correctement distingue pas définies et d' NULL.)

97voto

Zoredache Points 8873

Si la variable que vous vérifiez est dans la portée globale, vous pouvez le faire:

 array_key_exists('v', $GLOBALS) 
 

17voto

Matijs Points 1437

Vous pouvez utiliser le compact construction du langage à tester l'existence d'une variable de type null. Les Variables qui n'existent pas n'apparaîtra pas dans le résultat, tandis que des valeurs null spectacle.

$x = null;
$y = 'y';

$r = compact('x', 'y', 'z');
print_r($r);

// Output:
// Array ( 
//  [x] => 
//  [y] => y 
// ) 

Dans le cas de votre exemple:

if (compact('v')) {
   // True if $v exists, even when null. 
   // False on var $v; without assignment and when $v does not exist.
}

Bien sûr, pour les variables dans la portée globale vous pouvez également utiliser array_key_exists().

B. t.w. personnellement, je vous conseille d'éviter les situations comme la peste, où il y a une différence sémantique entre une variable n'existe pas et la variable ayant une valeur null. PHP et la plupart des autres langues, juste ne pense pas qu'il y est.

15voto

greatbigmassive Points 159

Expliquant NULL, logiquement penser

Je suppose que la réponse évidente à tout cela, c'est... Ne pas initialiser vos variables comme NULL, initalise comme quelque chose de pertinent à ce qu'ils sont destinés à devenir.

Traiter NULL correctement

NULL doivent être traités comme des "non-existant de la valeur", qui est la signification de la valeur NULL. La variable ne peut pas être considéré comme existant en PHP, car il n'a pas dit quel type d'entité qu'il essaie de l'être. Il peut aussi bien ne pas exister, donc PHP juste dit "Bien, il ne veut pas car il n'y a pas de point de toute façon et la valeur NULL est ma façon de le dire".

Un argument

Nous allons argumenter maintenant. "Mais NUL, c'est comme dire 0 ou FALSE ou ".

Faux, 0-FAUX" sont toujours classés comme des valeurs vides, mais ils SONT spécifiés comme un certain type de valeur ou de pré-déterminée en réponse à une question. FAUX la réponse, c'est oui ou non," la réponse est dans le titre quelqu'un de soumis, et 0 est la réponse à la quantité ou le temps, etc. Ils SONT définis comme un certain type de réponse/résultat qui rend valide qu'.

La valeur NULL est tout simplement pas de réponse, afin que jamais, il ne nous dit pas oui ou non et il ne nous dit pas le temps, et il ne nous dit pas une chaîne vide obtenu soumis. C'est la logique de base dans la compréhension de la valeur NULL.

Résumé

Il n'est pas sur la création loufoque fonctions de contourner le problème, c'est juste changer la façon dont votre cerveau ressemble à NULL. Si c'est NULL, assumer c'est pas comme n'importe quoi. Si vous êtes pré-définition des variables de pré-définir comme 0, FALSE ou "" en fonction du type d'utilisation que vous prévoyez pour eux.

N'hésitez pas à citer cette. C'est en haut de ma logique de la tête :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X