isset () et empty () - quoi utiliser

105

Pourriez-vous m'aider à améliorer mon style de codage? :) Dans certaines tâches, je dois vérifier - la variable est-elle vide ou contient quelque chose. Pour résoudre cette tâche, je fais généralement ce qui suit.

Vérifier - cette variable est-elle définie ou non? S'il est défini - je vérifie - il est vide ou pas

<?php
    $var = '23';
    if (isset($var)&&!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

Et j'ai une question - devrais-je utiliser isset () avant empty () - est-ce nécessaire? TIA!

Dmitry Belaventsev
la source
vide est! isset ($ var) || $ var == false
zloctb
2
à mon avis, empty () est un développement horrible de PHP. Comme il considère "0" dans toutes les formes comme "vide", vous risquez de tomber dans de mauvais pièges qui coûtent beaucoup de temps de débogage. Je dirais: évitez à tout prix et écrivez simplement la logique vous
Jean

Réponses:

143

Cela dépend de ce que vous recherchez, si vous cherchez simplement à voir s'il est vide, utilisez simplement emptycar il vérifie s'il est également défini, si vous voulez savoir si quelque chose est défini ou non isset.

Empty vérifie si la variable est définie et si c'est le cas, vérifie qu'elle est nulle, "", 0, etc.

Isset vérifie simplement s'il est défini, il pourrait s'agir de quelque chose qui n'est pas nul

Avec empty, les éléments suivants sont considérés comme vides:

  • "" (une chaîne vide)
  • 0 (0 sous forme d'entier)
  • 0,0 (0 comme flottant)
  • "0" (0 sous forme de chaîne)
  • NUL
  • FAUX
  • array () (un tableau vide)
  • var $ var; (une variable déclarée, mais sans valeur dans une classe)

Depuis http://php.net/manual/en/function.empty.php


Comme mentionné dans les commentaires, l'absence d'avertissement est également importante avec empty ()

Manuel PHP dit

empty () est l'opposé de (boolean) var, sauf qu'aucun avertissement n'est généré lorsque la variable n'est pas définie .

Concernant isset

Manuel PHP dit

isset () retournera FALSE si vous testez une variable qui a été définie sur NULL


Votre code serait bien comme:

<?php
    $var = '23';
    if (!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

Par exemple:

$var = "";

if(empty($var)) // true because "" is considered empty
 {...}
if(isset($var)) //true because var is set 
 {...}

if(empty($otherVar)) //true because $otherVar is null
 {...}
if(isset($otherVar)) //false because $otherVar is not set 
 {...}
Pez Cuckow
la source
C'est moyen - dans le code ci-dessus, je vérifie si la variable est définie ou non deux fois? :)
Dmitry Belaventsev
Vérifiez simplement s'il est vide, php ne lèvera pas d'erreur si ce n'est pas le cas.
Pez Cuckow
3
Vous omettez le plus gros point de empty: Il ne lance pas d'avertissement lorsque la variable testée n'existe pas. C'est tout l'intérêt de cette fonction, sinon c'est identique à == false.
deceze
1
Donc, le fait dans le manuel qu '"aucun avertissement n'est généré lorsque la variable n'est pas définie" m'a confus. Aucun avertissement ne signifie pas que je n'aurai pas de problèmes dans le code ci-dessous. Maintenant c'est clair pour moi. Merci beaucoup!
Dmitry Belaventsev
"isset vérifie simplement s'il est défini, il pourrait toujours être nul" Ce n'est pas vrai: issetsur une variable nulle (et existante) sera évalué à false.
netcoder
12

Dans votre cas particulier: if ($var).

Vous devez utiliser issetsi vous ne savez pas si la variable existe ou non. Puisque vous l'avez déclaré sur la toute première ligne, vous savez qu'il existe, donc vous n'avez pas besoin de, non, ne devriez pas l' utiliser isset.

Il en va de même empty, mais cela emptycombine également un contrôle de la véracité de la valeur. emptyéquivaut à !isset($var) || !$varet !emptyéquivaut à isset($var) && $varou isset($var) && $var == true.

Si vous voulez seulement tester une variable qui devrait exister pour la véracité , elle if ($var)est parfaitement adéquate et pertinente .

déceler
la source
Celui-ci explique beaucoup mieux. Si nous obtenons une comparaison pour tous les autres cas comme celui !empty is equivalent to isset($var) && $var-ci, ce serait génial. Merci @deceze
Vir
6

Vous pouvez simplement utiliser empty () - comme vu dans la documentation , il retournera false si la variable n'a pas de valeur.

Un exemple sur cette même page:

<?php
$var = 0;

// Evaluates to true because $var is empty
if (empty($var)) {
    echo '$var is either 0, empty, or not set at all';
}

// Evaluates as true because $var is set
if (isset($var)) {
    echo '$var is set even though it is empty';
}
?>

Vous pouvez utiliser isset si vous voulez simplement savoir s'il n'est pas NULL. Sinon, il semble que vide () est très bien à utiliser seul.

Chris
la source
Explication du vote négatif? Il ne demande pas s'ils sont identiques, il demande s'il doit vérifier le jeu avant de vérifier le vide.
chris
Je ne l' ai pas downvote, mais « utilisez isset si vous voulez le savoir est non nul » est incorrect: $var = null; isset( $var ) == true.
JJJ
Depuis le manuel PHP5 / 4: isset () - "Détermine si une variable est définie et n'est pas NULL." us.php.net/manual/en/function.isset.php
chris
2

Voici les sorties de isset()et empty()pour les 4 possibilités: non déclaré, nul, faux et vrai.

$a=null;
$b=false;
$c=true;

var_dump(array(isset($z1),isset($a),isset($b),isset($c)),true); //$z1 previously undeclared
var_dump(array(empty($z2),empty($a),empty($b),empty($c)),true); //$z2 previously undeclared

//array(4) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(true) [3]=> bool(true) } 
//array(4) { [0]=> bool(true) [1]=> bool(true) [2]=> bool(true) [3]=> bool(false) } 

Vous remarquerez que tous les résultats «isset» sont opposés aux résultats «vides» sauf pour le cas $b=false. Toutes les valeurs (à l'exception de null qui n'est pas une valeur mais une non-valeur) qui évaluent à false renverront true lorsqu'elles sont testées par issetet false lorsqu'elles sont testées par «vide».

Utilisez donc isset()lorsque vous êtes préoccupé par l'existence d'une variable. Et utilisez emptylorsque vous testez pour vrai ou faux. Si le type réel des questions de vide, l' utilisation is_nullet ===0, ===false, ===''.

dnagirl
la source
1

Empty renvoie true si la variable n'est pas définie. Mais isset renvoie true même si la variable n'est pas vide.

Whiskas
la source
-3
$var = 'abcdef';
if(isset($var))
{
   if (strlen($var) > 0);
   {
      //do something, string length greater than zero
   }
   else
   {
     //do something else, string length 0 or less
   }
}

Ceci est un exemple simple. J'espère que ça aide.

edit: ajouté issetdans le cas où une variable n'est pas définie comme ci-dessus, cela provoquerait une erreur, vérifier si son premier ensemble au moins aidera à éliminer quelques maux de tête sur la route.

Akos
la source
7
strlen sous zéro? Je veux voir cette chaîne.
deceze
@deceze Juste un exemple approximatif :) OK use = 0 not <0
Akos