Pour les personnes intéressées, j'ai développé ce sujet dans un petit article, qui fournit les informations ci-dessous sous une forme un peu mieux structurée : Le guide définitif de l'isset et du empty de PHP
Je pense que vous devriez envisager de ne pas vous contenter de rendre l'application "compatible E_NOTICE", mais de la restructurer entièrement. Avoir des centaines de points dans votre code qui essaient régulièrement d'utiliser des variables inexistantes semble être un programme plutôt mal structuré. Essayer d'accéder à des variables inexistantes ne devrait jamais arriver, d'autres langages s'y opposent au moment de la compilation. Le fait que PHP vous permette de le faire ne signifie pas que vous devriez le faire.
Ces avertissements sont là pour aide pour vous, pas pour vous ennuyer. Si vous recevez un avertissement "Vous essayez de travailler avec quelque chose qui n'existe pas !" votre réaction devrait être "Oups, c'est ma faute, laissez-moi arranger ça dès que possible." Sinon, comment allez-vous faire la différence entre "variables qui fonctionnent très bien non définies" et un code honnêtement erroné qui peut conduire à des erreurs graves ? C'est aussi la raison pour laquelle vous êtes toujours, toujours développer avec des rapports d'erreurs transformé en 11 et continuez à travailler sur votre code jusqu'à ce qu'il n'y ait plus une seule NOTICE
est émis. La désactivation des rapports d'erreurs est réservée aux environnements de production, afin d'éviter les fuites d'informations et de fournir une meilleure expérience utilisateur, même en présence d'un code bogué.
Pour élaborer :
Vous aurez toujours besoin isset
ou empty
quelque part dans votre code, la seule façon de réduire leur occurrence est d'initialiser vos variables correctement. Selon la situation, il existe différentes façons de le faire :
Arguments de fonction :
function foo ($bar, $baz = null) { ... }
Il n'y a pas besoin de vérifier si $bar
ou $baz
sont définis à l'intérieur de la fonction parce que vous venez de les définir, tout ce dont vous devez vous soucier est de savoir si leur valeur évalue à true
ou false
(ou autre).
Des variables régulières partout :
$foo = null;
$bar = $baz = 'default value';
Initialisez vos variables au début du bloc de code dans lequel vous allez les utiliser. Cela résout le problème de !isset
permet de s'assurer que vos variables ont toujours une valeur par défaut connue, donne au lecteur une idée de ce sur quoi le code suivant fonctionnera et sert donc également d'auto-documentation.
Les tableaux :
$defaults = array('foo' => false, 'bar' => true, 'baz' => 'default value');
$values = array_merge($defaults, $incoming_array);
La même chose que ci-dessus, vous initialisez le tableau avec des valeurs par défaut et vous les remplacez par des valeurs réelles.
Dans les autres cas, disons un modèle où vous produisez des valeurs qui peuvent ou non être définies par un contrôleur, il vous suffit de vérifier :
<table>
<?php if (!empty($foo) && is_array($foo)) : ?>
<?php foreach ($foo as $bar) : ?>
<tr>...</tr>
<?php endforeach; ?>
<?php else : ?>
<tr><td>No Foo!</td></tr>
<?php endif; ?>
</table>
Si vous vous retrouvez à utiliser régulièrement array_key_exists
vous devez évaluer l'usage que vous en faites. Le seul moment où cela fait une différence est ici :
$array = array('key' => null);
isset($array['key']); // false
array_key_exists('key', $array); // true
Comme indiqué ci-dessus, si vous initialisez correctement vos variables, vous n'avez pas besoin de vérifier si la clé existe ou non, car vous savez qu'elle existe. Si vous obtenez le tableau à partir d'une source externe, la valeur sera très probablement différente de celle de la clé. null
mais ''
, 0
, '0'
, false
ou quelque chose comme ça, c'est-à-dire une valeur que vous pouvez évaluer avec isset
ou empty
en fonction de votre intention. Si vous définissez régulièrement une clé de tableau à null
et vouloir que ça signifie autre chose que false
c'est-à-dire que si dans l'exemple ci-dessus les résultats différents de isset
et array_key_exists
font une différence dans la logique de votre programme, vous devez vous demander pourquoi. La simple existence d'une variable ne devrait pas être importante, seule sa valeur devrait avoir de l'importance. Si la clé est un true
/ false
puis utiliser true
ou false
pas null
. La seule exception à cette règle serait les bibliothèques de tiers qui veulent null
pour signifier quelque chose, mais comme null
est si difficile à détecter en PHP que je n'ai pas encore trouvé de bibliothèque qui le fasse.
6 votes
Je suis tout à fait d'accord. C'est pourquoi j'aime tant Zend Framework, le module de requête y est très bon. Si je travaille sur une petite application, je code habituellement une classe de requête simple avec des méthodes magiques __set et __get qui fonctionnent de manière similaire à la requête de ZF. De cette façon, j'évite toutes les occurrences de isset et empty dans mon code. De cette façon, tout ce que vous devez utiliser est if (count($arr) > 0) sur les tableaux avant d'itérer sur eux et if (null !== $variable) à quelques endroits critiques. C'est beaucoup plus propre.