set_error_handler() va en fait ignorer le rapport d'erreurs standard de PHP, et définir une
fonction de callback qui gérera les erreurs ; en particulier, il vous sera possible d'en déclencher grâce à
trigger_error() (que nous verrons plus loin).
Une fonction de callback est définie de la manière suivante sur Wikipédia :
Citation : WikipédiaEn informatique, une fonction de rappel (callback en anglais) est une fonction qui est passée en argument à une autre fonction. Cette dernière peut alors faire usage de cette fonction de rappel comme de n'importe quelle autre fonction, alors qu'elle ne la connaît pas par avance.
En PHP, il existe plusieurs sortes de fonctions et pour chacune, la syntaxe de son appel en tant que fonction de callback est différente.
- Les fonctions « simples » ; j'entends par là les fonctions que M@teo21 vous apprend à créer dans son tutoriel.
Dans ce cas, on passe le nom de la fonction comme une chaîne de caractères.
Exemple :
Code : PHP | <?php
set_error_handler('ma_fonction');
?>
|
- Les fonctions anonymes, c'est-à-dire créées à l'aide de create_function(). Dans ce cas, on pourra passer directement le create_function ou la variable qui le contient en paramètre.
Exemple :
Code : PHP | <?php
set_error_handler(create_function(...));
// Ou :
$ma_fonction = create_function(...);
set_error_handler($ma_fonction);
?>
|
- Les méthodes de classe appelées de manière statique.
Vous ne le savez peut-être pas, mais il existe plusieurs façons de programmer en PHP : la programmation fonctionnelle (comme enseigné dans les cours de M@teo21) et la POO. Je ne vais pas entrer dans les détails ici mais sachez qu'en POO, les fonctions sont réparties dans des classes et sont appelées « méthodes ».
Une méthode est donc caractérisée par son nom et par le nom de sa classe, il nous faudra donc passer les deux dans un array.
Exemple :
Code : PHP | <?php
set_error_handler(array('ma_classe', 'ma_methode'));
?>
|
- Les méthodes d'un objet instancié.
En POO, on manipule un type de variable particulier : les « objets », qu'on initialise de la façon suivante :
Code : PHP | <?php
$obj = new ma_classe();
?>
|
$obj est alors appelé « objet instancié ».
On pourra alors utiliser le callback d'une méthode de $obj en passant dans un array une référence de $obj et du nom de la méthode.
Exemple :
Code : PHP | <?php
$obj = new ma_classe();
set_error_handler(array(&$obj, 'ma_methode'));
?>
|
Note : la syntaxe &$obj signifie qu'on passe une référence de $obj. Une référence est une sorte de raccourci vers une variable ; au lieu de copier sa valeur comme on le fait d'habitude, on copie son emplacement dans la mémoire, on donne un autre nom à la variable et par conséquent, si la référence est modifiée, la variable le sera également.
Personnellement, je vais utiliser une fonction « simple », mais la démarche est similaire dans tous les cas.
La fonction doit avoir au moins 2 arguments :
- le type d'erreur (il existe des constantes que nous verrons plus loin) ;
- le message de l'erreur.
En outre, il existe 3 arguments optionnels :
- le nom du fichier dans laquelle l'erreur a été rencontrée ;
- la ligne de l'erreur dans le fichier ;
- le contexte de l'erreur ;
Je ne me servirai pas du dernier, mais libre à vous d'aller voir la doc pour plus d'informations sur ce paramètre.
Exemple de fonction :
Code : PHP | <?php
function my_error_handler($no, $str, $file, $line){
echo '<p>Erreur ['.$no.'] : '.$str.'<br/>';
echo 'Survenue dans le fichier : "'.$file.'" à la ligne '.$line.'.</p>';
}
?>
|
$no contient en fait le type de l'erreur sous forme numérique, chacune de ces valeurs correspond à une constante ; une liste exhaustive de ces constantes est disponible dans la doc (
ici).
Dans cette liste, vous pouvez voir apparaître 3 constantes particulières :
E_USER_ERROR,
E_USER_WARNING et
E_USER_NOTICE.
Ces constantes sont celles que nous manipulerons et que nous enverrons à la fonction de gestion d'erreurs à l'aide de
trigger_error(). Ainsi, nous pouvons définir des comportements différents de la fonction suivant le type d'erreur.
Exemple :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | <?php
function my_error_handler($no, $str, $file, $line){
switch($no){
// Erreur fatale
case E_USER_ERROR:
echo '<p><strong>Erreur fatale</strong> : '.$str.'</p>';
exit;//on arrete le script
break;
// Avertissement
case E_USER_WARNING:
echo '<p><strong>Avertissement</strong> : '.$str.'</p>';
break;
// Note
case E_USER_NOTICE:
echo '<p><strong>Note</strong> : '.$str.'</p>';
break;
// Erreur générée par PHP
default:
echo '<p><strong>Erreur inconnue</strong> ['.$no.'] : '.$str.'<br/>';
echo 'Dans le fichier : "'.$file.'", à la ligne '.$line.'.</p>';
break;
}
}
?>
|
Ce n'est qu'un exemple, vous pouvez très bien changer l'affichage pour qu'il soit similaire à celui du Site du Zéro, par exemple, avec des liens pour aller à la page suivante / précédente, ou encore ajouter les autres types d'erreurs.
Note :
error_reporting() n'influera pas sur le niveau des erreurs qui seront rapportées à votre fonction, et par défaut, celui-ci sera maximum. Pour changer ce comportement, on utilisera le 2
e argument de
set_error_handler().
Voilà !

Maintenant, il reste à savoir comment déclencher nos erreurs et ça tombe bien, c'est justement le sujet de la prochaine partie.
