empty($var) renvoie true si la variable n'existe pas ou si sa valeur est évaluée à faux : null, false, 0, 0.0, "", "0" ou un tableau vide []. Pour toute autre valeur, elle renvoie false. Comme isset(), elle n'affiche jamais de warning pour une variable ou une clé de tableau non définie.
empty($x) équivaut à !isset($x) || !$x. Autrement dit : absente, ou convertie en false.
Quelles valeurs sont vides
Choisissez une valeur dans le tableau pour voir empty() à côté d'isset() et du cast (bool). Chaque case a été calculée par PHP 8.3.
| $x | empty | isset | bool |
|---|---|---|---|
| null | |||
| false | |||
| 0 | |||
| 0.0 | |||
| "" | |||
| "0" | |||
| [] | |||
| " " | |||
| "0.0" | |||
| "a" | |||
| "null" | |||
| [0] | |||
| 1 | |||
| -1 |
Les surprises sont aux deux extrémités : "0" est vide, alors que " " (un espace), "0.0", "null" et [0] ne le sont pas.
"0" est vide : le bug classique
Comme "0" est évalué à faux, empty() traite une quantité de 0, un score de 0 ou un code PIN "0" comme « rien de saisi ». Cela pose problème dans les formulaires, où toutes les valeurs arrivent sous forme de chaînes.
Pour une saisie texte, le test fiable de « rien de saisi » est trim($value) === "". Gardez empty() pour les valeurs où 0 signifie vraiment rien.
Vérifier si une chaîne est vide
Pour tester exactement une chaîne vide, comparez avec "". Pour traiter aussi les espaces comme du vide, appliquez d'abord trim. Depuis PHP 5.5, empty() accepte des expressions, donc empty(trim($s)) fonctionne aussi (mais avec le même problème de "0").
trim() n'accepte pas null sans avis de dépréciation depuis PHP 8.1, c'est pourquoi le bloc écrit trim($s ?? "").
Vérifier si un tableau est vide
Pour les tableaux, empty($arr), $arr === [] et count($arr) === 0 donnent tous la même réponse. empty() a l'avantage de fonctionner sur une variable ou une clé qui n'existe peut-être pas.
array_filter() sans callback retire toutes les valeurs évaluées à faux, c'est donc un moyen rapide de demander « ce tableau contient-il quelque chose de réel ».
Valider un champ de formulaire obligatoire
!empty() est une façon courante de rendre un champ obligatoire, tant que 0 n'est pas une réponse valide. Exécutez ce bloc, laissez les champs vides et cliquez sur Send, puis remplissez-les et envoyez à nouveau : le script s'exécute encore une fois avec $_POST rempli.
empty($_POST["terms"]) couvre les deux cas pour la case à cocher : pas envoyée du tout, ou envoyée avec une valeur vide. La page sur les formulaires va plus loin avec des messages d'erreur par champ.
empty ou isset
Les deux sont sûres sur des variables et des clés non définies. Elles répondent à des questions différentes :
isset($x): existe-t-elle et ne vaut-elle pasnull? Utilisez-la pour les clés facultatives, les cases à cocher et « est-ce que cela a été envoyé ».!empty($x): existe-t-elle et est-elle évaluée à vrai ? Utilisez-la pour « contient quelque chose de réel », quand0et"0"ne comptent pas.$x === ""ou$x === []: est-elle exactement vide ? Utilisez-la quand0est une valeur valide.
La page isset couvre l'autre moitié, y compris isset() sur plusieurs variables à la fois et la différence avec array_key_exists().
Questions fréquentes
Quelles valeurs empty() considère-t-elle comme vides en PHP ?
empty($x) vaut true quand $x n'existe pas ou vaut null, false, 0, 0.0, "", "0" ou []. Tout le reste n'est pas vide, y compris " " (un espace), "0.0", "false" et [0].
Pourquoi "0" est-il vide en PHP ?
empty() équivaut à !$x sans le warning pour les variables non définies, et la chaîne "0" se convertit en false. Cela rend empty() inadaptée aux champs où 0 est une réponse valide ; vérifiez plutôt $x === '' ou trim($x) === ''.
Comment vérifier si un tableau est vide en PHP ?
empty($arr) et $arr === [] fonctionnent tous les deux, tout comme count($arr) === 0. empty() renvoie aussi true quand la variable n'est pas définie, alors que count() sur une variable non définie afficherait un warning puis lèverait une TypeError pour null.
Quand utiliser empty() plutôt qu'isset() ?
Utilisez isset() quand vous avez seulement besoin de savoir qu'une valeur existe (une case à cocher a été envoyée, une clé de configuration est présente). Utilisez !empty() quand la valeur doit aussi être non vide, par exemple un champ texte obligatoire. Attention aux champs où 0 est valide, car empty('0') vaut true.