101 votes

Vérifier si la valeur est isset et null

Je dois vérifier si la valeur est définie comme n'importe quoi, y compris null. isset traite les valeurs nulles comme indé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 $bar n'est pas défini.

Je dois trouver une condition qui réponde aux exigences suivantes:

 if(something($bar)) // returns false;
if(something($foo)) // returns true;
 

Des idées?

92voto

Henrik Opel Points 16296

IIRC, vous pouvez utiliser get_defined_vars() pour cela:

 $foo = NULL;
$vars = get_defined_vars();
if (array_key_exists('bar', $vars)) {}; // Should evaluate to FALSE
if (array_key_exists('foo', $vars)) {}; // Should evaluate to TRUE
 

31voto

John Magnolia Points 3304

Si vous traitez avec des propriétés d'objet pouvant avoir la valeur NULL, vous pouvez utiliser: property_exists() au lieu de isset()

 <?php

class myClass {
    public $mine;
    private $xpto;
    static protected $test;

    function test() {
        var_dump(property_exists($this, 'xpto')); //true
    }
}

var_dump(property_exists('myClass', 'mine'));   //true
var_dump(property_exists(new myClass, 'mine')); //true
var_dump(property_exists('myClass', 'xpto'));   //true, as of PHP 5.3.0
var_dump(property_exists('myClass', 'bar'));    //false
var_dump(property_exists('myClass', 'test'));   //true, as of PHP 5.3.0
myClass::test();

?>
 

Comme opposé à isset (), property_exists () retourne TRUE même si la propriété a la valeur NULL.

15voto

Loïc Février Points 3016

Voir http://stackoverflow.com/questions/418066/best-way-to-test-for-a-variables-existence-in-php-isset-is-clearly-broken

  if( array_key_exists('foo', $GLOBALS) && is_null($foo)) // true & true => true
 if( array_key_exists('bar', $GLOBALS) && is_null($bar)) // false &  => false
 

1voto

masakielastic Points 431

Le code suivant écrit en tant qu'extension PHP équivaut à array_key_exists ($ name, get_defined_vars ()) (grâce à Henrik et Hannes).

 // get_defined_vars()
// https://github.com/php/php-src/blob/master/Zend/zend_builtin_functions.c#L1777
// array_key_exists
// https://github.com/php/php-src/blob/master/ext/standard/array.c#L4393

PHP_FUNCTION(is_defined_var)
{

    char *name;
    int name_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
        return;
    }

    if (!EG(active_symbol_table)) {
        zend_rebuild_symbol_table(TSRMLS_C);
    }

    if (zend_symtable_exists(EG(active_symbol_table), name, name_len + 1)) {
        RETURN_TRUE;
    }

}
 

0voto

Raveline Points 1768

Vous pouvez utiliser is_null et empty à la place de isset (). Vide n'imprime pas de message d'erreur si la variable n'existe pas.

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