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
.)