Question

PHP a l’habitude d’évaluer (int) 0 et (chaîne) "0" vide lorsque vous utilisez la fonction empty () . Cela peut avoir des résultats inattendus si vous attendez des valeurs numériques ou des chaînes de 0. Comment puis-je "réparer" est-il possible de ne renvoyer que true aux objets, tableaux, chaînes, etc. vides?

Était-ce utile?

La solution

Cela n'a pas fonctionné pour moi.

if (empty($variable) && '0' != $variable) {
  // Do something
}

j'ai utilisé à la place:

if (empty($variable) && strlen($variable) == 0) {
  // Do something
}

Autres conseils

J'utilise rarement empty () pour la raison que vous décrivez. Cela confond les valeurs légitimes avec le vide. C’est peut-être parce que j’ai beaucoup travaillé avec SQL, mais je préfère utiliser NULL pour indiquer l’absence de valeur.

PHP a une fonction is_null () qui teste une variable ou une expression étant NULL .

$foo = 0;
if (is_null($foo)) print "integer 0 is null!\n"; 
else print "integer 0 foo is not null!\n";

$foo = "0";
if (is_null($foo)) print "string '0' is null!\n"; 
else print "string '0' is not null!\n";

$foo = "";
if (is_null($foo)) print "string '' is null!\n"; 
else print "string '' is not null!\n";

$foo = false;
if (is_null($foo)) print "boolean false is null!\n"; 
else print "boolean false is not null!\n";

Vous pouvez également utiliser l'opérateur === pour effectuer un test similaire:

if ($foo === null) print "foo is null!\n";

Ceci est vrai si $ foo est NULL , mais pas si false , zéro, " " , etc.

" 0 " a toujours été considéré comme faux ( ou vide) en PHP, et cela a beaucoup de sens (pas que je vais discuter cela ici). Si vous souhaitez également que zéro soit évalué à true, utilisez strlen ($ value) .

" Fixing " est un point de vue. Une autre solution serait de supposer que ce n’est pas "cassé" et d’apprendre à travailler avec ce qu’il a été conçu intentionnellement.

Étant donné le problème que vous décrivez, la meilleure chose à faire serait de renforcer votre code afin que la variable ne puisse pas être placée dans un état de type indéterminé. Sinon, vous voudrez tester le type de données en utilisant gettype ().

J'ajoute toujours à ma base de code

function is_blank($value) {
    return empty($value) && !is_numeric($value);
}

et utilisez-le à la place de empty (). Cela résout le problème de garder les zéros (int, float ou string) non vides.

Voir http://www.php.net/manual/fr /function.empty.php#103756 qui a été ajouté en mai 2011.

En règle générale, vous souhaitez utiliser l'opérateur triple égal à pour déterminer le moment où une valeur est vraiment nulle ou fausse. Ceci est plus spécifique et les résultats TOUJOURS sont calculés exactement comme prévu.

Créer une fonction distincte pour effectuer quelque chose que vous pouvez faire dans une seule ligne de code, mais utiliser un autre opérateur semble trop compliqué et ajoute de l’obscurcissement.

De plus, de nombreux programmeurs ont tendance à utiliser 0 ou une chaîne vide pour indiquer une valeur inexistante, mais il est plus correct (et je pense que cela serait préférable) d'utiliser une valeur nulle pour désigner toute valeur (quel que soit son type) qui est vraiment inexistant.

J'utilise ceci pour détecter le vide:

''  --> true
'0' --> false
0   --> false

la fonction:

function is_empty_or_zero($str) {
 return (is_null($str) || ($str === ''));
}

J'ai créé une IsEmpty () une fonction rapide concise.

function IsEmpty($mData) {
    return is_int($mData) ? false : 
        is_string($mData) ? $mData=="" : 
        empty($mData);
}

Vous essayez d'utiliser empty () pour quelque chose pour lequel il n'est pas destiné. Personnellement, je pense que son comportement provient d'un ancien paradigme de programmation en PHP et qu'il pourrait probablement être retiré.

Au lieu de cela, rendez vos contrôles plus explicites. Plutôt que de vérifier si la valeur n'est pas utile, vérifiez qu'elle l'est. Par exemple, si vous voulez un tableau, cochez-le ( is_array () ) plutôt que de vérifier s'il s'agit d'une chaîne.

De plus, vous pouvez compter sur le fait que toutes les variables $ _ POST et $ _GET sont des chaînes, de sorte que vous pouvez effectuer des comparaisons avec " " ;, ou vérifier que strlen () == 0 .

if ( is_int($val) || !empty($val) ) {;}

J'ai utilisé la fonction ou pour vérifier la valeur transmise était vide ou non.

/*
* SPACE is not empty - Please do trim before using this function for your own purpose
*  var_dump(is_having_value(0));        // true
   var_dump(is_having_value(0000));     // true
   var_dump(is_having_value("    0"));  // true
   var_dump(is_having_value(""));       // false
   var_dump(is_having_value("  "));     // true
   var_dump(is_having_value('\t'));     // true
   var_dump(is_having_value(''));       // false
   var_dump(is_having_value('o'));      // true
   var_dump(is_having_value('O'));      // true
   var_dump(is_having_value('0'));      //true
   var_dump(is_having_value(null));     //false
   var_dump(is_having_value());         //false
*/
function is_having_value($val = null) {
    if (is_array($val) || is_object($val)):
        $logic_empty = empty($val);
        return !$logic_empty;
    else:
        $ascii = ord($val);
        if ($ascii == 48 || $ascii = 0 || $ascii == 32):
            return true;
        else:
            $logic_empty = empty($val);
            return !$logic_empty;
        endif;
    endif;
}

La solution la plus efficace pour résoudre ce problème consiste à vérifier si la variable est fausse, par exemple.


if (!$variable_name) {echo $variable_name;}

Peu importe que la variable soit vide ou nulle, tout est égal à false lorsque mis dans un if conditionnel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top