我们将用一系列的文章来彻底的搞懂PHP中的缺点和非常到底是怎么回事,有哪些处理这些缺点和非常的机制,我们该当如何对待它们。
什么是缺点?缺点,一样平常是由PHP本身的成分所导致的问题,缺点的语法、环境的配置不当等都会引起缺点。缺点和php.ini文件当中的error_reporting参数有直接的关系。相信大家都配过这个参数。一样平常会把它配置为 E_ALL & ~E_NOTICE 。这是什么意思呢?我们先来看看PHP中有哪些缺点类型:
在配置文件中的 E_ALL & ~E_NOTICE 便是显示所有缺点但关照缺点类缺点除外的意思。当然,我们在代码中也可以手动的改变这种缺点信息的关照。

error_reporting(E_ALL);
通过这行代码,我们就让当前文件代码中的缺点全部显示出来了。Notice 和 Warning 类型的缺点是不会中断代码运行的,他们是关照和报警,并不是致命的缺点。而其他类型的缺点则会中断代码的实行。
$a=100/0;//Warning:Divisionbyzeroecho$f;//Notice:Undefinedvariable:ftest();//Fatalerror:UncaughtError:Calltoundefinedfunctiontest()echo1;
上述代码等分别是Warning的除0缺点警告和echo $f;的未定义变量提示,这两行代码都是可以在报错后可以连续向下运行的。而未定义的方法则是Fatal级别的致命缺点了。以是末了那个1也不会输出了。
那么缺点要如何处理呢?原则上我们该当是要去消灭这些缺点的,由于他们基本上不会是我们写代码的逻辑没理清而产生的逻辑缺点,是实打实的一些语法及环境缺点,这种缺点在生产环境是不应该涌现的。同时,它们与非常最最主要的一个差异便是,它们无法通过try...catch进行捕获。也便是说,这种缺点没有非常好的缺点后处理机制。
try{$a=100/0;//Warning:Divisionbyzeroecho$f;//Notice:Undefinedvariable:f}catch(Excepiton$e){print_r($e);//无法捕获}
不过,PHP还是供应了一些处理缺点的函数供我们利用。
set_error_handler()基本上只能处理 Warning 和 Notice 级别的缺点。
set_error_handler(function($errno,$errstr){echo'set_error_handler:',$errno,$errstr,PHP_EOL;});$a=100/0;//Warning:Divisionbyzeroecho$f;//Notice:Undefinedvariable:ftest();//Fatalerror:UncaughtError:Calltoundefinedfunctiontest()//set_error_handler:2Divisionbyzero//set_error_handler:8Undefinedvariable:f
从代码中可以看出,Fatal error这种致命缺点并没有捕获到。
register_shutdown_function()实在它也不是用来处理缺点的,这个函数的浸染是在发生致命缺点,程序停滞前末了会调用的一个函数。可以用来记录日志或者关闭一些主要的外部句柄,不过在生产环境中,我们一样平常会用php.ini中的log_error来进行日志的记录。以是这个函数也用得并不多。
register_shutdown_function(function(){echo'register_shutdown_function:',PHP_EOL;print_r(error_get_last());});test();//register_shutdown_function://Array//(//[type]=>1//[message]=>UncaughtError:Calltoundefinedfunctiontest()in/php/202002/source/一起搞懂PHP的缺点和非常(一).php:16//Stacktrace://#0{main}//thrown//[file]=>/php/202002/source/一起搞懂PHP的缺点和非常(一).php//[line]=>16//)
这个函数的回调函数中没有任何的参数变量,以是我们须要通过 error_get_last() 来拿到本次实行中发生的所有缺点情形。其余要把稳的是,只有在运行时产生的缺点都会调用到这个注册函数的回调中,编译时的缺点是也是无法通过这个函数捕获到的,比如直接的语法缺点:
register_shutdown_function(function(){echo'register_shutdown_function:',PHP_EOL;print_r(error_get_last());});test(a+-);//Parseerror:syntaxerror,unexpected')'
总结
综上所述,就像在文章前面说过的,缺点是该当只管即便不要带莅临盆环境中去的,它们并没有很好的处理机制。或者说,缺点便是我们要只管即便避免的东西,由于大部分情形下它和我们的逻辑代码并没有太大的关系。而且严重的缺点会直接导致程序运行的中止,无法像非常一样通过catch机制担保程序连续运行。
下一篇我们将连续学习下一个知识点:非常及其处理机制。
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/%E4%B8%80%E8%B5%B7%E6%90%9E%E6%87%82PHP%E7%9A%84%E9%94%99%E8%AF%AF%E5%92%8C%E5%BC%82%E5%B8%B8%EF%BC%88%E4%B8%80%EF%BC%89.php
参考文档: https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html https://www.php.net/manual/zh/language.errors.basics.php https://www.php.net/manual/zh/errorfunc.constants.php https://www.php.net/manual/zh/errorfunc.configuration.php#ini.error-reporting https://www.php.net/manual/zh/function.error-reporting.php https://www.php.net/manual/zh/function.set-error-handler.php https://www.php.net/manual/zh/function.register-shutdown-function.php