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 seulNOTICEest é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 issetou emptyquelque 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 $barou $bazsont 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 à trueou 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 !issetproblè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 nullmais '', 0, '0', falseou quelque chose comme ça, soit une valeur que vous pouvez évaluer avec issetou empty, selon votre intention. Si vous définissez régulièrement une clé de tableau sur nullet 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 issetet array_key_existsfont 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, utiliseztrueou falsenon null. La seule exception à cela serait les bibliothèques tierces qui veulent nullsignifier quelque chose, mais comme nullc'est si difficile à détecter en PHP, je n'ai pas encore trouvé de bibliothèque qui le fasse.