POURQUOI CELA ARRIVE-T-IL?
Au fil du temps, PHP est devenu un langage plus axé sur la sécurité. Les paramètres qui étaient auparavant désactivés par défaut sont désormais activés par défaut. Un exemple parfait de cela est E_STRICT
, qui est devenu activé par défaut à partir de PHP 5.4.0 .
De plus, selon la documentation PHP, par défaut, E_NOTICE
est désactivé dans php.ini. Les documents PHP recommandent de l'activer à des fins de débogage . Cependant, lorsque je télécharge PHP depuis le référentiel Ubuntu - et depuis la pile Windows de BitNami - je vois autre chose.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Notez que error_reporting
la valeur de production est en fait définie par défaut, et non la valeur "par défaut" par défaut. Ceci est quelque peu déroutant et n'est pas documenté en dehors de php.ini, donc je n'ai pas validé cela sur d'autres distributions.
Pour répondre à votre question, cependant, cette erreur apparaît maintenant alors qu'elle ne s'est pas produite auparavant parce que:
Vous avez installé PHP et les nouveaux paramètres par défaut sont quelque peu mal documentés mais ne les excluent pas E_NOTICE
.
E_NOTICE
des avertissements tels que des variables non définies et des index non définis contribuent à rendre votre code plus propre et plus sûr. Je peux vous dire que, il y a des années, garder E_NOTICE
activé m'a forcé à déclarer mes variables. Cela rendait beaucoup plus facile l'apprentissage du C, ne déclarait pas que les variables étaient beaucoup plus importantes.
QUE PUIS-JE FAIRE À CE SUJET?
Désactivez-le E_NOTICE
en copiant la «valeur par défaut» E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
et en la remplaçant par ce qui n'est actuellement pas commenté après la connexion égale error_reporting =
. Redémarrez Apache ou PHP si vous utilisez CGI ou FPM. Assurez-vous que vous éditez le "bon" php.ini. Le bon sera Apache si vous exécutez PHP avec Apache, fpm ou php-fpm si vous exécutez PHP-FPM, cgi si vous exécutez PHP-CGI, etc. Ce n'est pas la méthode recommandée, mais si vous avez du code hérité qui va être extrêmement difficile à modifier, alors ce pourrait être votre meilleur pari.
Désactivez au niveau E_NOTICE
du fichier ou du dossier. Cela peut être préférable si vous avez du code hérité mais que vous voulez faire les choses de la bonne manière sinon. Pour ce faire, vous devez consulter Apache2, Nginx ou quel que soit le serveur de votre choix. Dans Apache, vous utiliseriez l' php_value
intérieur de <Directory>
.
Réécrivez votre code pour être plus propre. Si vous devez le faire lors du passage à un environnement de production ou si vous ne voulez pas que quelqu'un voit vos erreurs, assurez-vous de désactiver l'affichage des erreurs et de ne consigner que vos erreurs (voir display_errors
et log_errors
dans php.ini et les paramètres de votre serveur) .
Pour développer l'option 3: c'est l'idéal. Si vous pouvez suivre cette voie, vous devriez. Si vous ne suivez pas cette route initialement, envisagez de la déplacer éventuellement en testant votre code dans un environnement de développement. Pendant que vous y êtes, débarrassez-vous ~E_STRICT
et ~E_DEPRECATED
voyez ce qui pourrait mal se passer à l'avenir. Vous allez voir BEAUCOUP d'erreurs inconnues, mais cela vous empêchera d'avoir des problèmes désagréables lorsque vous aurez besoin de mettre à niveau PHP à l'avenir.
QUE SIGNIFIENT LES ERREURS?
Undefined variable: my_variable_name
- Cela se produit lorsqu'une variable n'a pas été définie avant utilisation. Lorsque le script PHP est exécuté, il prend simplement en interne une valeur nulle. Cependant, dans quel scénario auriez-vous besoin de vérifier une variable avant qu'elle ne soit définie? En fin de compte, c'est un argument pour le "code bâclé". En tant que développeur, je peux vous dire que j'adore ça quand je vois un projet open source où les variables sont définies aussi haut dans leur portée qu'elles peuvent l'être. Il permet de savoir plus facilement quelles variables vont apparaître à l'avenir et facilite la lecture / l'apprentissage du code.
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- Cela se produit lorsque vous essayez d'accéder à une valeur dans un tableau et qu'elle n'existe pas. Pour éviter cette erreur, effectuez une vérification conditionnelle.
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
Une autre option consiste à déclarer un tableau vide en haut de votre fonction. Ce n'est pas toujours possible.
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(conseil supplémentaire)
- Lorsque je rencontrais ces problèmes et d'autres, j'ai utilisé NetBeans IDE (gratuit) et cela m'a donné une multitude d'avertissements et de notifications. Certains d'entre eux offrent des conseils très utiles. Ce n'est pas une exigence, et je n'utilise plus d'IDE, sauf pour les grands projets. Je suis plus une
vim
personne de nos jours :).