Apprendre à coder sur pierre-giraud.com

DES COURS COMPLETS ET GRATUITS POUR TOUS

SOMMAIRE

Introduction

  1. Présentation du cours
  2. Introduction au PHP
  3. Mettre en place un env. de travail

Les bases en PHP

  1. Syntaxe de base du PHP
  2. Premières instructions PHP
  3. Introduction aux variables PHP
  4. Types de valeurs et concaténation
  5. Opérations sur les variables
  6. Conditions et opérateurs de comparaison
  7. Les conditions if, if...else et if... elseif... else
  8. Utilisation avancée des conditions
  9. Structures ternaires et switch
  10. Les boucles PHP
  11. Découverte des fonctions
  12. La portée des variables
  13. Les constantes PHP
  14. Les variables tableaux PHP
  15. Tableaux associatifs
  16. Tableaux multidimensionnels
  17. Test n°1

Gestion des dates en PHP

  1. Le timestamp
  2. Obtenir et formater une date
  3. Tester la validité d'une date
  4. Test n°2

Opérations sur les fichiers en PHP

  1. Lire, ouvrir, fermer un fichier
  2. Parcourir et lire un fichier par partie
  3. Créer un fichier et écrire dedans
  4. Ecrire dans un fichier
  5. Les instructions include et require
  6. Test n°3

Les variables superglobales

  1. Découverte des variables superglobales
  2. Les cookies
  3. Les sessions
  4. Test n°4

Les expressions régulières et PHP

  1. Découverte des regex
  2. Les fonctions PHP PCRE
  3. Quantifieurs et options
  4. Classes de caractères
  5. Test n°5

L'orienté objet en PHP

  1. Classes, instances et objets
  2. Propriétés et méthodes
  3. Extension de classe et héritage
  4. Le principe d'encapsulation
  5. La méthode constructeur
  6. L'opérateur de résolution de portée et la surcharge
  7. Constantes, méthodes et propriétés statiques
  8. Les classes et méthodes abstraites
  9. Les interfaces
  10. Les méthodes magiques
  11. Le chainage de méthodes
  12. Test n°6

Notions avancées en POO

  1. Le typage explicite
  2. Les traits
  3. Les closures et les classes anonymes
  4. L'auto-chargement des classes
  5. Le mot clef final
  6. Résolution statique à la volée
  7. Parcourir des objets
  8. Le clonage d'objets
  9. Comparaison d'objets
  10. Test n°7

Filtres, erreurs et exceptions

  1. Introduction aux filtres
  2. Utilisation pratique des filtres
  3. Gérer les erreurs en PHP
  4. Gérer les exceptions en PHP

LA GESTION DES ERREURS EN PHP

Erreur ou exception ?

La littérature concernant la différence entre erreur et exception en PHP est généralement très confuse et très difficilement compréhensible pour un débutant.

La raison principale est que la différence entre ces deux termes est très mal comprise par beaucoup et, pour cause, elle n'est pas évidente.

Une erreur en PHP correspond à un résultat inattendu lors de l'exécution d'un script. Par exemple, si on crée une boucle infinie ou si on utilise une variable qui n'existe pas dans un script, nous allons déclencher une erreur.

Pour être maintenant plus précis, on peut discerner deux types d'erreurs : les erreurs qui nécessitent obligatoirement une retouche du script pour être gérées et celles qui peuvent être résolues sans forcément avoir à modifier le script en soi.

Par exemple, si on crée une boucle infinie (boucle sans condition de sortie), nous allons être obligés de modifier notre script PHP pour régler le problème. En revanche, si on tente d'inclure un fichier qui n'est pas disponible au moment de l'affichage de la page, cela est différent. En effet, on peut proposer une méthode alternative pour recherhcer la fichier à l'utilisateur ou créer le fichier si celui-ci n'existait pas.

Une exception en PHP correspond à une erreur qu'on va pouvoir gérer en utilisant la programmation orientée objet (POO).

Or, nous n'allons pouvoir utiliser une approche orientée objet qu'avec les erreurs qui ne demandent pas nécessairement une retouche du script PHP à priori. Dans ces cas là, nous parlerons donc généralement d'exceptions.

Au final, on fait référence aux termes erreur et exception pour désigner deux façons différentes de traiter un problème dans le script.

Pourquoi gérer les erreurs en PHP

Avant toute chose, vous devez savoir que le PHP propose par défaut une gestion très basique des erreurs.

Ainsi, si votre script contient des erreurs, une notice d'erreur va apparaitre dans votre navigateur lors du chargement d'une page utilisant ce script. Cette notice va contenir des informations sur l'erreur en soi, ainsi que le fichier dans lequel elle se trouve et la ligne où elle a été trouvée.

Par exemple, ci-dessous, j'essaie d'afficher le contenu d'une variable $x qui n'existe pas et j'essaie également d'inclure un fichier que je n'ai pas créé.

Des erreurs et exceptions me sont donc renvoyées.

On tente d'echo le contenu d'une variable non déclarée

PHP renvoie par défaut des messages d'erreur

Notez que si vous testez cela chez vous, selon votre configuration, il est possible que rien ne s'affiche.

Dans les versions récentes de MAMP, par exemple, l'affichage des erreurs et exceptions à été désactivé. Si vous voulez les voir comme moi, il vous faudra modifier les lignes error_reporting et display_errors de votre fichier php.ini.

Gérer les erreurs va s'avérer essentiel pour plusieurs raisons.

Vous devez bien comprendre que lorsque vous placez votre site sur serveur, il y a de fortes chances pour que vous n'ayez pas à priori de contrôle sur l'affichage ou non des erreurs comme je vous l'ai montré ci-dessus.

Si vous n'anticipez pas en gérant les erreurs potentielles au sein de votre script même, vos visiteurs pourraient donc voir des choses comme ci-dessus.

Au delà de l'impact sur l'expérience utilisateur, la confiance de ceux-ci dans votre site et sur l'ergonomie de votre site, ne pas gérer les erreurspeut ouvrir des brèches dans votre site web.

Ces brèches peuvent ensuite profiter à des utilisateurs malveillants qui pourront les exploiter. Ne pas gérer les erreurs, c'est avant tout donc encourir des problèmes de sécurité.

Comment prendre en charge les erreurs en PHP ?

Nous utilisons principalement trois méthodes pour gérer les erreurs en PHP :

  • On peut utiliser la fonction die() qui va stopper l'exécution du script en cas d'erreur ;
  • On peut créer des gestionnaires d'erreurs personnalisés à l'aide des fonctions PHP de type error ;
  • On peut utiliser les outils de rapport d'erreurs natifs en PHP (code d'erreur et information sur l'erreur, utiles en phase de développement pour avoir rapidement une idée du pourquoi un script ne fonctionne pas).

Nous allons prendre un exemple pour chacune de ces trois façons de faire immédiatement.

Gérer les erreurs avec la fonction die() en PHP

La fonction die() va nous permettre de stopper immédiatement l'exécution du script en cas d'erreur et de renvoyer le message d'erreur de notre choix.

Imaginons par exemple que l'on souhaite ouvrir un fichier au sein d'un script PHP. Nous allons pouvoir gérer le cas où le fichier est manquant avec die().

On peut gérer des erreurs graves avec la fonction PHP die

L'exécution de la fonction die arrête l'exécution du script

Notez cependant que la fonction die() stoppe l'exécution d'un script. Tout ce qui est écrit après l'appel à die() ne sera donc pas exécuté.

Souvent, nous ne voudrons pas arrêter l'exécution du script dans son entiéreté. Il nous faudra alors utiliser une autre méthode.

Créer une fonction gestionnaire d'erreur personnalisée

Un autre bon moyen de prendre en charge des potentielles erreurs est de créer une fonction PHP personnalisée.

Notre fonction va récupérer des informations renvoyées par le PHP en cas d'erreur.

On va pouvoir lui passer entre deux et cinq arguments :

  • Le code ou niveau d'erreur (plus d'informations à ce sujet un peu plus bas) ;
  • Le message d'erreur ;
  • Le nom du fichier dans lequel l'erreur s'est produite ;
  • La ligne où l'erreur s'est produite ;
  • Le contexte de l'erreur (tableau contenant les variables impliquées dans l'erreur ainsi que leurs valeurs.

Encore une fois, nous allons simplement choisir de récupérer certaines informations renvoyées par le PHP en cas d'erreur.

Pour que notre fonction soit reconnue par le PHP comme la fonction gestionnaire d'erreur de notre script, il va cependnat falloir la définir en tant que telle.

Pour faire cela, nous allons utiliser la fonction set_error_handler() qui nous permet justement de préciser une fonction à utiliser comme gestionnaire d'erreurs.

Prenons immédiatement un exemple. Imaginons que vous vouliez diviser un nombre par le contenu d'une variable. On va imaginer que vous ne connaissiez pas le contenu de cette variable à priori (par exemple, on peut imaginer que ce sont vos utilisateurs qui soumettent un nombre via un formulaire ou que le nombre soit choisi au hasard).

Comme vous le savez, on ne peut pas diviser par zéro. Ainsi, si notre variable $x stocke la valeur 0, une erreur va être déclenchée par le PHP comme vous pouvez le voir ci-dessous :

On tente de diviser par zéro en PHP

On ne peut pas diviser par zéro : le PHP renvoie une erreur

Maintenant, on va créer une fonction personnalisée pour gérer cette erreur. On va ensuite la définir en tant que telle grâce à set_error_handler().

On crée une fonction gestionnaire d'erreur personnalisée en PHP

On utilise notre fonction gestionnaire d'erreur en PHP pour afficher des informations relatives à l'erreur

Comme vous le voyez, on ne récupère ici que les informations d'erreur relatives au niveau de l'erreur ainsi que la description de l'erreur fournie par le PHP.

Encore une fois, vous pouvez récupérer le nom du fichier, la ligne, etc. où se situe l'erreur en rajoutant d'autres arguments à votre fonction personnalisée d'erreur.

Connaître et utiliser les niveaux d'erreur en PHP pour prendre en charge une erreur

Comme promis précédemment, voici les différents niveaux de rapport d'erreurs en PHP avec leurs constantes associées ainsi que leur signification :

Valeur Constante Description
2 E_WARNING Sert à afficher un message d'avertissement d'erreur. L'exécution du script n'est pas stoppée.
8 E_NOTICE Sert à afficher une note lorsqu'on rencontre quelque chose dans le script qui pourrait être une erreur, mais qui pourrait églaement subvenir lors de l'exécution normale du script.
256 E_USER_ERROR Sert à afficher une erreur fatale déclenchée par l'utilisateur.
512 E_USER_WARNING Sert à afficher un message d'avertissement dans le cas d'une erreur non fatale délcenchée par l'utilisateur.
1024 E_USER_NOTICE Sert à afficher une note générée par l'utilisateur.
4096 E_RECOVERABLE_ERROR Sert à afficher une erreur non fatale qu'on va pouvoir prendre en charge avec une fonction gestionnaire personnalisée.
8191 E_ALL Sert à afficher toutes les erreurs et tous les avertissements.

L'intérêt de connaître cela est qu'on va pouvoir se servir de ces niveaux de rapport d'erreurs et en particulier des constantes associées avec des fonctions natives PHP pour gérer différemment les différents niveaux d'erreurs et obtenir des informations précises.

Par exemple, on va pouvoir préciser en deuxième argument de notre fonction set_error_handler() le niveau de rapport d'erreur pour lequel notre fonction gestionnaire d'erreurs personnalisée donc s'exécuter.

Bien évidemment, je tiens à repréciser que ce n'est pas nous qui définissons le niveau d'erreur par défaut. C'est le rôle du PHP, qui nous renvoie le code associé. Nous ne faisons qu'utiliser les informations renvoyées par le PHP.

Dans notre exemple précédent on a vu que le niveau de rapport d'erreur était 2, ce qui correspond à un E_WARNING. Si on précise une autre constante en deuxième argument de set_error_handler(), notre fonction de gestion d'erreur ne s'exécutera pas si la constante n'est pas compatible avec l'erreur rencontrée.

On ne s'occupe que des erreurs de niveau E_WARNING avec set_error_handler

Notre erreur de niveau E_WARNING est bien prise en charge par notre fonction

Ici, pas de soucis : notre erreur est bien de niveau E_WARNING, notre fonction gest_err() et donc bien définie comme gestionnaire d'erreur et s'exécute pour gérer l'erreur.

En revanche, observez le résultat si on cible un autre niveau d'erreur non compatible avec notre erreur : notre fonction gest_err() ne s'exécutera pas puisqu'elle n'aura pas été définie par set_error_handler() comme le gestionnaire de cette erreur.

Cette fois ci, on ne gère que les erreurs de niveau E_USER_ERROR

Notre erreur E_WARNING n'est pas gérée puisqu'on a passé une constante non compatible à set_error_handler

Sachez finalement qu'on va également pouvoir utiliser la fonction error_reporting() pour définir manuellement le ou les différents niveaux d'erreurs qui doivent être rapportés par PHP durant l'exécution d'un script.

Il suffit de passer les différentes constantes relatives aux niveaux d'erreurs afin que les niveaux d'erreurs en question soit rapportés en PHP.

Notez qu'utiliser error_reporting() n'impacte que les rapports d'erreurs envoyés par le PHP mais n'interfère pas si vous avez créé un gestionnaire d'erreur personnalisé.

On utilise la fonction error_reporting pour que le PHP ne rapporte que certains niveaux d'erreurs

Grace à error_reporting, le PHP ne rapporte que les erreurs de niveau E_ERROR et E_WARNING

Dans le cas présent, notre erreur est de niveau E_WARNING, elle est donc bien rapportée. Notez que si vous souhaitez demander au PHP de rapporter plusieurs niveaux d'erreurs différents pour un script avec error_reporting(), il faut séparer les différentes constantes associées par une barre verticale.

Si maintenant je demande au PHP de ne rapporter que les erreurs de niveau E_ERROR, notre erreur E_WARNING sera ignorée.

On utilise error_reporting pour ne rapporter que des erreurs de niveau E_ERROR

Notre erreur E_WARNING n'est pas rapportée par le PHP

En pratique, je vous déconseille toutefois de modifier réglages par défaut de rapports d'erreurs du PHP à moins d'être vraiment certain de ce que vous faites et d'avoir un besoin très spécifique.

Chapitre précédent

Chapitre suivant