Je dois vérifier si la valeur est définie comme quoi que ce soit, y compris nul. isset
traite les valeurs nulles comme non définies et renvoie false
. Prenons l'exemple suivant:
$foo = null;
if(isset($foo)) // returns false
if(isset($bar)) // returns false
if(isset($foo) || is_null($foo)) // returns true
if(isset($bar) || is_null($bar)) // returns true, raises a notice
Notez que ce $bar
n'est pas défini.
Je dois trouver une condition qui satisfait à ce qui suit:
if(something($bar)) // returns false;
if(something($foo)) // returns true;
Des idées?
isset
= est défini?, Votre variable est définie sur null. J'ai perdu beaucoup de temps à cause de celui-ci ...Réponses:
IIRC, vous pouvez utiliser
get_defined_vars()
pour cela:la source
get_defined_vars
s'adapte heureusement à la portée.get_defined_vars()
:array_key_exists('foo', compact('foo'))
. Ou plus rapide, si vous testez global:array_key_exists('foo', $GLOBALS)
.Si vous avez affaire à des propriétés d'objet qui peuvent avoir une valeur NULL, vous pouvez utiliser:
property_exists()
au lieu deisset()
la source
Voir Meilleur moyen de tester l'existence d'une variable en PHP; isset () est clairement cassé
la source
J'ai trouvé que
compact
c'est une fonction qui ignore les variables non définies mais agit sur celles définies surnull
, donc lorsque vous avez une grande table de symboles locaux, j'imagine que vous pouvez obtenir une solution plus efficace de vérificationarray_key_exists('foo', get_defined_vars())
en utilisantarray_key_exists('foo', compact('foo'))
:Mettre à jour
Depuis PHP 7.3, compact () donnera un avis pour les valeurs non définies, donc malheureusement cette alternative n'est plus valide.
la source
compact
. Néanmoins, je l'ai voté car il est utile dans une situation: si vous voulez savoir s'ilfoo
existe dans le contexte actuel , peu importe d'où il vient - si vous ne vous souciez pas de savoir s'il est local ou global, vous voulez juste savoir s'il existe.get_defined_vars
. Regardez ici .Le code suivant écrit comme extension PHP est équivalent à array_key_exists ($ name, get_defined_vars ()) (merci à Henrik et Hannes).
la source
Vous pouvez utiliser is_null et empty au lieu de isset (). Empty n'imprime pas de message d'erreur si la variable n'existe pas.
la source
isset
.is_null
a le même problème queis_set
: il ne peut pas faire la distinction entre "not set" et "set to null", ce qui est le problème d'OP.empty
est encore pire, comme le souligne Calum.Voici une solution de contournement stupide utilisant xdebug. ;-)
la source
is_null($bar)
renvoie true, car il n'a aucune valeur du tout. Alternativement, vous pouvez utiliser:pour vérifier si
$bar
est défini et ne retournera vrai que si:la source
if(isset($bar))
donne du faux quand$bar = null
.$bar = "test"
).isset($bar)
renvoie false, même après$bar = null;
.