Maison >développement back-end >tutoriel php >Explication détaillée de l'utilisation de la fonction set_error_handler() en php
Le contenu partagé avec vous dans cet article est une explication détaillée de l'utilisation de la fonction set_error_handler() en PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent se référer au
<.>Fonction set_error_handler. La fonction est d'empêcher les fuites sur un mauvais chemin
Qu'est-ce qu'une fuite sur un mauvais chemin ?
Lorsque nous écrivons des programmes, il est inévitable qu'il y ait des problèmes (des problèmes sont souvent rencontrés), et lorsque PHP rencontre une erreur, il donnera l'emplacement, le numéro de ligne et la raison de le script d'erreur
Beaucoup de gens disent que ce n'est pas grave. En effet, dans la phase de débogage, cela n'a pas vraiment d'importance, et je pense que donner le chemin de l'erreur est nécessaire. Mais les conséquences d'une fuite du chemin réel sont inimaginables Pour certains intrus, cette information est très importante. En fait, de nombreux serveurs ont désormais ce problème. Certains administrateurs réseau ont simplement défini display_errors dans le fichier de configuration PHP sur Off pour résoudre le problème (il semble que nous l'ayons fait), mais je pense que cette méthode est trop négative. Parfois, nous avons vraiment besoin de PHP pour renvoyer des informations d'erreur pour le débogage. Et lorsque quelque chose ne va pas, vous devrez peut-être également donner une explication à l’utilisateur ou même accéder à une autre page.Alors, quelle est la solution ?
PHP a fourni la fonction set_error_handler() pour personnaliser les poignées de gestion des erreurs depuis la version 4.1.0, mais peu de rédacteurs de scripts le savent.L'utilisation de set_error_handler est la suivante :
Code Phpstring set_error_handler ( callback error_handler [, int error_types])
Nous utilisons désormais la gestion des erreurs personnalisée pour filtrer le chemin réel.
Par exemple : Supposons qu'il existe une variable $admin, nous sommes utilisés pour déterminer si le visiteur est un administrateur (cette détermination peut être faite par IP ou par ID d'utilisateur connecté)
Code Php
//admin为管理员的身份判定,true为管理员。 //自定义的错误处理函数一定要有这4个输入变量$errno,$errstr,$errfile,$errline,否则无效。 function my_error_handler($errno,$errstr,$errfile,$errline) { //如果不是管理员就过滤实际路径 if(!admin) { $errfile=str_replace(getcwd(),"",$errfile); $errstr=str_replace(getcwd(),"",$errstr); } switch($errno) { case E_ERROR: echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n"; echo "程序已经停止运行,请联系管理员。"; //遇到Error级错误时退出脚本 exit; break; case E_WARNING: echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) \n"; break; default: //不显示Notice级的错误 break; } }
De cette manière, une fonction de gestion des erreurs est personnalisée, alors comment confier le traitement des erreurs à cette fonction personnalisée ?
Code Php
// 应用到类 set_error_handler(array(&$this,"appError")); //示例的做法 set_error_handler("my_error_handler");
si simple, de cette façon, ça peut être bon Il résout efficacement la contradiction entre la sécurité et la commodité du débogage. Et vous pouvez également réfléchir à rendre le message d’erreur plus beau pour qu’il corresponde au style du site Web.
L'auteur a donné deux points qui méritent attention. Je les publierai également, en espérant attirer l'attention de nos compatriotes :
E_ERROR. , E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR et E_COMPILE_WARNING ne seront pas traités par ce handle, c'est-à-dire qu'ils seront affichés de la manière la plus originale. Cependant, ces erreurs sont causées par des erreurs de compilation ou du noyau PHP et ne se produiront pas dans des circonstances normales.
Après avoir utilisé set_error_handler(), error_reporting () ne sera pas valide. Autrement dit, toutes les erreurs (à l'exception des erreurs mentionnées ci-dessus) seront transmises à la fonction personnalisée pour traitement.
Enfin, l'auteur original a donné un autre exemple (quelle personne sérieuse et responsable. Haha)
Php代码
//先定义一个函数,也可以定义在其他的文件中,再用require()调用 function myErrorHandler($errno, $errstr, $errfile, $errline) { //为了安全起见,不暴露出真实物理路径,下面两行过滤实际路径 $errfile=str_replace(getcwd(),"",$errfile); $errstr=str_replace(getcwd(),"",$errstr); switch ($errno) { case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Aborting...<br />\n"; exit(1); break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } /* Don't execute PHP internal error handler */ return true; } //下面开始连接MYSQL服务器,我们故意指定MYSQL端口为3333,实际为3306。 $link_id=@mysql_pconnect("localhost:3333","root","password"); set_error_handler(myErrorHandler); if (!$link_id) { trigger_error("出错了", E_USER_ERROR); }
嗯,根据上面的那些解释,以及原作者认真负责的态度,我想如果我还学不会这个set_error_handler函数,那么我真该去撞墙了。
好了,总结一下,下面是 set_error_handler 三种用法:
Php代码
class CallbackClass { function CallbackFunction() { // refers to $this } function StaticFunction() { // doesn't refer to $this } } function NonClassFunction($errno, $errstr, $errfile, $errline) { } // 三种方法如下: 1: set_error_handler('NonClassFunction'); // 直接转到一个普通的函数 NonClassFunction 2: set_error_handler(array('CallbackClass', 'StaticFunction')); // 转到 CallbackClass 类下的静方法 StaticFunction 3: $o =& new CallbackClass(); set_error_handler(array($o, 'CallbackFunction')); // 转到类的构造函数,其实本质上跟下面的第四条一样。 4. $o = new CallbackClass(); // The following may also prove useful: class CallbackClass { function CallbackClass() { set_error_handler(array(&$this, 'CallbackFunction')); // the & is important } function CallbackFunction() { // refers to $this } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!