Tester qu'un tableau est vide

Il existe plusieurs manières pour tester qu'un tableau est vide en PHP, et celle que je vois le plus souvent est :

$var = [];

if (empty($var)) { ... }

En lisant le code, on sait tout de suite ce qu'il fait, le nom de la fonction est assez explicite. Mais le problème est l'utilisation de la fonction empty qui ne sert pas qu'à tester les tableaux !

Savez-vous qu'utilisez empty revient à écrire :

$var = [];

if (
    isset($var) === false
    || $var === false
    || $var === 0
    || $var === -0
    || $var === 0.0
    || $var === -0.0
    || $var === ''
    || $var === '0'
    || $var === []
) { ... }

On voit bien ici qu'on peut utiliser empty pour tester aussi qu'un entier est égale à 0, ou qu'une chaîne est vide. Et c'est bien le soucis de cette fonction : elle fait trop de choses et peut causer de nombreux bugs.

Par exemple, un test avec empty d'une variable non déclarée retourne true sans erreurs ! Donc un bug peut se glisser si vous vous trompez dans le nom de votre variable :

$var = [1, 2, 3];

var_dump(
    empty($errorVar)
); // bool(true)

Il est donc préférable de tester directement la valeur attendu :

var_dump(
    $errorVar === []
); // bool(false)
/*
 * En php < 8 : Notice: Undefined variable: myErrorVar in /in/Nm3CT on line 8
 * En php >= 8 : Warning: Undefined variable $myErrorVar in /in/Nm3CT on line 8
 */

Quel est la bonne méthode alors ?

Pour tester qu'un tableau est vide, je vous conseille plutôt d'utiliser l'une des propositions ci-dessous.

$var = [];

if (count($var) === 0) {...}
// ou 
if (sizeof($var) === 0) {...}

Ma solution préférée :

$var = [];

if ($var === []) {...}

Et plus généralement, je vous conseille de bannir la fonction empty de votre vocabulaire et de votre quotidien :

  • Vous voulez tester qu'un entier est égal à 0 ?
$var === 0
  • Vous voulez tester qu'une chaîne est vide ?
$var === ''
  • Vous voulez tester qu'une variable préalablement déclarée et initialisée est égale à null ?
$var = null;
...

if ($var === null) {...}
  • Si vous voulez tester qu'une variable existe et est différente de null, il faut alors utiliser la fonction isset
isset($var)

C'est simple non ?

Et si je veux tester plusieurs choses en même temps ?

Si par exemple, vous voulez tester que votre variable est différente de null et que ce n'est pas une chaîne vide, vous pouvez soit combiner les deux conditions :

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

Soit créer une méthode privée au nom explicite qui va faire ce contrôle

private function isTokenValid(?string $token): bool
{
    return $token !== null && $token !== '';
}

// dans la condition
if ($this->isTokenValid($var)) {...} 

Vous aimeriez progresser en PHP ? Mais vous ne savez pas comment vous y prendre ?

S'entraîner pour progresser en PHP

Mon programme "S'entraîner pour progresser en PHP" est disponible. Il vous permettra de recevoir chaque semaine un kata de code directement dans votre boîte mail, ainsi que des aides à la réalisation, des vidéos explicatives et des défis supplémentaires.

Reçois dès maintenant un kata gratuit en cliquant sur le bouton ci-dessous.