Pour ceux qui sont intéressés, j'ai développé ce sujet dans un petit article, qui fournit les informations ci-dessous sous une forme un peu mieux structurée: The Definitive Guide To PHP's isset And empty
IMHO, vous devriez penser non seulement à rendre l'application "E_NOTICE compatible", mais à restructurer le tout. Avoir des centaines de points dans votre code qui essaient régulièrement d'utiliser des variables inexistantes ressemble à un programme plutôt mal structuré. Essayer d'accéder à des variables inexistantes ne devrait jamais arriver, d'autres langages hésitent à cela 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 vous aider , 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, mon mauvais, laissez-moi résoudre ce problème dès que possible." Sinon, comment allez-vous faire la différence entre "des variables qui fonctionnent très bien et non définies" et un code honnêtement erroné qui peut conduire à de graves erreurs ? C'est aussi la raison pour laquelle vous développez toujours, toujours avec le rapport d'erreur passé à 11 et continuez à brancher votre code jusqu'à ce que pas un seulNOTICE
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 cas de code bogué.
Élaborer:
Vous aurez toujours besoin isset
ou empty
quelque part dans votre code, le seul moyen de réduire leur occurrence est d'initialiser correctement vos variables. Selon la situation, il existe différentes manières de procéder:
Arguments de fonction:
function foo ($bar, $baz = null) { ... }
Il n'est pas nécessaire de vérifier si $bar
ou $baz
sont définis à l'intérieur de la fonction car vous venez de les définir, tout ce dont vous avez besoin est de savoir si leur valeur est évaluée à true
ou false
(ou quoi que ce soit d'autre).
Variables régulières n'importe où:
$foo = null;
$bar = $baz = 'default value';
Initialisez vos variables en haut d'un bloc de code dans lequel vous allez les utiliser. Cela résout le !isset
problème, garantit 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 ainsi également de sorte d'auto-documentation.
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 les valeurs par défaut et les écrasez par les valeurs réelles.
Dans les cas restants, disons un modèle où vous produisez des valeurs qui peuvent ou non être définies par un contrôleur, il vous suffira 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 devriez évaluer à quoi vous l'utilisez. Le seul moment où cela fait une différence, c'est ici:
$array = array('key' => null);
isset($array['key']); // false
array_key_exists('key', $array); // true
Comme indiqué ci-dessus cependant, si vous initialisez correctement vos variables, vous n'avez pas besoin de vérifier si la clé existe ou non, car vous le savez. Si vous obtenez le tableau à partir d' une source externe, la valeur sera très probablement pas null
mais ''
, 0
, '0'
, false
ou quelque chose comme ça, soit une valeur que vous pouvez évaluer avec isset
ou empty
, selon votre intention. Si vous définissez régulièrement une clé de tableau sur null
et que vous voulez qu'elle ait une signification autre que false
, c'est-à-dire 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 devriez vous demander pourquoi. La simple existence d'une variable ne devrait pas être importante, seule sa valeur devrait être importante. Si la clé est un indicateur true
/ false
, utiliseztrue
ou false
non null
. La seule exception à cela serait les bibliothèques tierces qui veulent null
signifier quelque chose, mais comme null
c'est si difficile à détecter en PHP, je n'ai pas encore trouvé de bibliothèque qui le fasse.