Est-ce que empty() est suffisant ou utilisez isset ()?

Remarque: - je sais assez bien sur empty () et isset (), qu'est-ce que Je demande si c'est la façon la plus appropriée/efficace de les utiliser.

j'ai juste vu à php.net cette phrase sous empty() référence:

aucun avertissement n'est généré si la variable n'existe pas. Cela signifie que empty () est essentiellement l'équivalent concis de !isset ($var) / / $ var == false.

mais encore une fois, comme je travaille principalement maintenant sur des applications d'autres personnes (soit des projets autonomes, des sites Web utilisant des cms ou même des cadres), j'ai souvent vu des gens écrire:

if (isset ($var) && $var != '')
// or
if (isset ($var) && !empty($var))

(principalement avec les variables $_GET et $_POST, mais pas seulement)

autant que je comprenne manuel, l'extrait ci-dessous est équivalent:

if (!empty($var))

ou est-ce que je rate quelque chose? Quelle est techniquement la meilleure façon de vérifier existe-t-il une variable avec une valeur?

je connais les deux fonctions, leurs destinations. Je veux juste savoir si empty() est tous nécessaires pour vérifier l' si c'est un jeu de variables et valeur. Je sais que ça marche, mais est-ce 100% correct et sûr?

24
demandé sur Forien 2014-12-09 17:02:37

6 réponses

Codes Op générés à partir de isset($var) && !empty($var)

line     #  *  op                           fetch           ext  return  operands
---------------------------------------------------------------------------------


   3     0  >   EXT_STMT                                                 
         1      ISSET_ISEMPTY_VAR                      12800000    ~0       !0
         2  >   JMPZ_EX                                      ~0    ~0,     ->6
         3  >   ISSET_ISEMPTY_VAR                      11800000    ~1       !0
         4      BOOL_NOT                                     ~2    ~1
         5      BOOL                                         ~0    ~2
         6  >   FREE                                               ~0
   4     7  >   RETURN                                              1

et !empty($var)

line     #  *  op                           fetch           ext  return  operands
---------------------------------------------------------------------------------
   3     0  >   EXT_STMT                                                 
         1      ISSET_ISEMPTY_VAR                      11800000    ~0       !0
         2      BOOL_NOT                                           ~1       ~0
         3      FREE                                                        ~1
   4     4  >   RETURN                                                       1

Donc oui, il ne répétez ISSET_ISEMPTY_VAR mais !$empty. Il dépend de la valeur passée, mais il n'existe pas le top est une opcode moins BOOL_NOT. mais si elle existe, la voie du bas est plus rapide.

bien qu'il soit peu probable que ce soit un goulot d'étranglement dans une application

19
répondu exussum 2014-12-09 19:09:04

empty est suffisant, mais attention à ses conséquences.

Si $var est un 0, '0',false,'',[],null (et peut-être quelques autres que j'ai oublié), alors il sera considéré comme isset certes, mais il sera également empty. Notez que chaîne '0' est un particulier gotcha.

Personnellement je ne l'utilise isset. Si une valeur est requise nonempty, je vais alors vérifier cela séparément et jeter une erreur (qui est saisi par les blocs appropriés de manipulation d'erreur) pour donner à l'utilisateur une erreur simple et précise "cette valeur est requise".

14
répondu Niet the Dark Absol 2014-12-09 14:09:30

isset vous indiquera simplement si la variable est définie, quelle que soit la valeur (null, false etc).

Si vous voulez tester la valeur n'est pas une chaîne vide, null, false ou 0 empty.

4
répondu fire 2014-12-09 14:08:02

Si vous utilisez !(empty ($var) puis la variable est définie et contient une valeur qui peut être vide comme "" ou null ou 0.

if(!empty($_COOKIE['dev'])) echo 'developer mode';

Si le cookie est là, vide ou rempli avec une valeur quelconque, la condition est vraie. Sinon, il sera ignoré.

c'est utile si vous travaillez avec des tableaux et ne savez pas si la clé est définie pour éviter les Avertissements.

3
répondu Markus Zeller 2014-12-09 14:21:38

lorsque vous évaluez $_POST et $_GET, la différence entre isset et isempty est utile. Comme vous l'avez dit, non vide() var signifie que isset et la valeur telle qu'elle a été envoyée.

if (!empty($var))

is certainly enough for

if (isset ($var) && $var != '')

ce qui vous manque, c'est juste que parfois

if (isset($var)) {
  if ($var != '') {

  } else {
    ... do "A"
  }
} else {
  ... do something different from "A"
}

vous pourriez avoir besoin de ceci. Et si cela arrive souvent, quand ce ne sera pas le cas, vous n'aurez qu'à fusionner les deux conditions if et oublier empty(). Comme vous l'avez déjà trouvé. Je pense que l'utilisation juste "vide" peut être plus rapide mais en interne, probablement il fait les mêmes vérifications.

3
répondu AndreaBogazzi 2014-12-09 14:30:30

les variables GET/POST/COOKIE doivent être vérifiées avec filter_input fonction. Cette fonction permet de vérifier si la clé spécifiée est présente dans l'entrée (GET/POST/COOKIE/etc) et de la filtrer en option. Exemple:

$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
/*
 * QUERYSTRING           RESULT
 * ==================    ===============
 * test.php?             $id is NULL
 * test.php?id=          $id is FALSE
 * test.php?id=123abc    $id is FALSE
 * test.php?id=123       $id is int(123)
 */
if ($id !== NULL && $id !== FALSE) { /*...*/ }

empty() la fonction par contre vérifie simplement si une variable n'est pas définie ou si sa valeur est falsy. Cette fonction ne peut pas être utilisée dans des situations où les valeurs erronées ont un sens:

if (empty($_GET["number_of_children"])) {
    /*
     * GET parameter is not set or its value is zero or falsy
     * Show an error? Or process the value?
     */
}
if (empty($_GET["number_of_children"]) === false) {
    /*
     * Definitely a truthy value
     * But how does one specify that he/she has no children?
     */
}
2
répondu Salman A 2014-12-09 19:43:08