Pourquoi vérifier à la fois isset () et! Empty ()


269

Y a-t-il une différence entre issetet !empty. Si je fais cette double vérification booléenne, est-ce correct ou redondant? et existe-t-il un moyen plus court de faire la même chose?

isset($vars[1]) AND !empty($vars[1])

3
Il y a un joli tableau sur les résultats de leur utilisation avec différents types de variables (elles ont des différences) ici: virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
Jeff Clayton

Les compléments exacts évidents sont isset et is_null, mais! Empty en recouvre plusieurs différents. Tout dépend du type de données que vous testez.
Jeff Clayton

Réponses:


420

C'est complètement redondant. emptyest plus ou moins un raccourci !isset($foo) || !$fooet !emptyest analogue à isset($foo) && $foo. C'est à dire emptyl'inverse de issetplus une vérification supplémentaire de la véracité d'une valeur.

Ou en d'autres termes, emptyest identique à !$foo, mais ne lance pas d'avertissement si la variable n'existe pas. C'est le point principal de cette fonction: faire une comparaison booléenne sans se soucier de la variable définie.

Le manuel le dit comme ceci:

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

Vous pouvez simplement utiliser !empty($vars[1])ici.


7
Mais s'il n'y a pas, $vars[1]il recevra un avis.
karim79

6
Je n'ai aucune idée d'où j'ai eu cette idée. Plus un.
karim79

8
@karim IMO emptyest l'une des fonctions les plus mal comprises de PHP. Le petit extrait sur "aucun avertissement n'est généré" est très facile à ignorer. J'ai dû numériser moi-même la documentation plusieurs fois pour la repérer et la publier ici.
décomposer

2
empty($vars[1])ne provoque aucun avertissement même $vars[1]n'est pas défini, mais le echo $vars[1]sera. J'ai vérifié le fait en utilisant echo $vars[1]; if (!empty($vars[1])) echo 1; else echo 0;.
Amil Waduwawara

4
@Shahor De nombreuses langues considèrent 0comme false. PHP n'est pas le seul. Je ne sais toujours pas quelle est votre plainte.
décomposition

33

isset() teste si une variable est définie et non nulle:

http://us.php.net/manual/en/function.isset.php

empty() peut renvoyer true lorsque la variable est définie sur certaines valeurs:

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

Pour illustrer cela, essayez le code suivant avec $ the_var non affecté, défini sur 0 et défini sur 1.

<?php

#$the_var = 0;

if (isset($the_var)) {
  echo "set";
} else {
  echo "not set";
}

echo "\n";

if (empty($the_var)) {
  echo "empty";
} else {
  echo "not empty";
}
?>

12

La réponse acceptée n'est pas correcte.

isset () N'EST PAS équivalent à! empty ().

Vous créerez des bogues plutôt désagréables et difficiles à déboguer si vous suivez cette voie. par exemple, essayez d'exécuter ce code:

<?php

$s = '';

print "isset: '" . isset($s) . "'. ";
print "!empty: '" . !empty($s) . "'";

?>

https://3v4l.org/J4nBb


7
La réponse acceptée ne suggère aucunement que cela issetéquivaut à !empty.
décomposer

8
$a = 0;
if (isset($a)) { //$a is set because it has some value ,eg:0
    echo '$a has value';
}
if (!empty($a)) { //$a is empty because it has value 0
    echo '$a is not empty';
} else {
    echo '$a is empty';
}

1
Mais vous n'avez pas géré de variable pas de casse.
Amil Waduwawara

3

Videz juste vérifiez que la variable / le tableau référencé a une valeur si vous vérifiez le doc php (vide) vous verrez que ces choses sont considérées comme emtpy

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

tandis que isset vérifie si la variable isset et non null qui peut également être trouvée dans le doc php (isset)


2

Ce n'est pas nécessaire.

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.

php.net


2
Cela n'a jamais été nécessaire sur aucune version PHP, car vide vérifie déjà (pas) isset. Vous confondez le fait que vide prend désormais en charge les expressions avec la question.
alxgb

Ce n'est vrai que cinq ans plus tard.
Lennon

2

isset($vars[1]) AND !empty($vars[1])est équivalent à !empty($vars[1]).

J'ai préparé un code simple pour le montrer empiriquement.

La dernière ligne est une variable non définie.

+-----------+---------+---------+----------+---------------------+
| Var value | empty() | isset() | !empty() | isset() && !empty() |
+-----------+---------+---------+----------+---------------------+
| ''        | true    | true    | false    | false               |
| ' '       | false   | true    | true     | true                |
| false     | true    | true    | false    | false               |
| true      | false   | true    | true     | true                |
| array ()  | true    | true    | false    | false               |
| NULL      | true    | false   | false    | false               |
| '0'       | true    | true    | false    | false               |
| 0         | true    | true    | false    | false               |
| 0.0       | true    | true    | false    | false               |
| undefined | true    | false   | false    | false               |
+-----------+---------+---------+----------+---------------------+

Et le code

$var1 = "";
$var2 = " ";
$var3 = FALSE;
$var4 = TRUE;
$var5 = array();
$var6 = null;
$var7 = "0";
$var8 = 0;
$var9 = 0.0;

function compare($var)
{
    print(var_export($var, true) . "|" .
        var_export(empty($var), true) . "|" .
        var_export(isset($var), true) . "|" .
        var_export(!empty($var), true) . "|" .
        var_export(isset($var) && !empty($var), true) . "\n");
}

for ($i = 1; $i <= 9; $i++) {
    $var = 'var' . $i;
    compare($$var);
}

@print(var_export($var10, true) . "|" .
    var_export(empty($var10), true) . "|" .
    var_export(isset($var10), true) . "|" .
    var_export(!empty($var10), true) . "|" .
    var_export(isset($var10) && !empty($var10), true) . "\n");

La variable non définie doit être évaluée en dehors de la fonction, car la fonction elle-même crée une variable temporaire dans la portée elle-même.


0

"Vide": ne fonctionne que sur les variables. Vide peut signifier différentes choses pour différents types de variables (consultez le manuel: http://php.net/manual/en/function.empty.php ).

"isset": vérifie si la variable existe et recherche une vraie valeur NULL ou fausse. Peut être annulé en appelant "annulé". Encore une fois, consultez le manuel.

L'utilisation de l'un ou l'autre dépend du type de variable que vous utilisez.

Je dirais qu'il est plus sûr de vérifier les deux, car vous vérifiez d'abord si la variable existe et si elle n'est pas vraiment NULL ou vide.


3
@szahn "plus sûr de vérifier les deux", - en tant que programmeur, vous pouvez vérifier tout ce que vous voulez pour la sécurité. Mais si votre code est redondant, vous pouvez être redondant en tant que programmeur.
madlopt

0

si nous utilisons la même page pour ajouter / modifier via le bouton de soumission comme ci-dessous

<input type="hidden" value="<?echo $_GET['edit_id'];?>" name="edit_id">

alors nous ne devrions pas utiliser

isset($_POST['edit_id'])

bcoz edit_idest défini tout le temps, qu'il s'agisse d'ajouter ou de modifier une page, à la place, nous devons utiliser la condition de vérification ci-dessous

!empty($_POST['edit_id'])

le post précédent a été soumis bcoz j'ai appuyé sur enter par erreur, voici ma réponse complète ... pourquoi downvote? :(
diEcho

0
  • Depuis le site Web PHP, en se référant à la empty()fonction:

Renvoie FALSEsivar a une valeur non vide et non nulle.

C'est une bonne chose à savoir. En d'autres termes, tout de NULL, à 0à "" sera renvoyé TRUElors de l'utilisation de la empty()fonction.

  • Voici la description de ce que la isset()fonction retourne:

Renvoie TRUEs'il varexiste;FALSEautrement.

En d'autres termes, seules les variables qui n'existent pas (ou les variables ayant strictement des NULLvaleurs) retourneront FALSEsur la isset()fonction. Toutes les variables qui ont n'importe quel type de valeur, que ce soit 0, une chaîne de texte vierge, etc. retourneront TRUE.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.