_autoload、spl_autoload_register、register_shutdown_function、set_error_handler、set_exception_handler
在php开发之中,经常使用一些框架,往往会令我们对php一些比较重要的函数慢慢地有些陌生,趁有空之际,好好总结一番,便于以后查看
1._autload函数
当php调用一个找不到类的时候就会自动调用__autoload函数
eg:
function __autoload( $class ) {
$file = $class . '.class.php';
if ( is_file($file) ) {
require_once($file);
}else{
die('调用一个未定义的类');
}
}
$stu=new Student();
var_dump($stu);
执行结果如下
解析:脚步在student对象时候,并没有引进Student类,php引擎就会调用_autoLoad函数来试图找到Student类,并将该类名作为参数传递给_autoload函数
2.spl_autoload_register
spl_autoload_register(),这个函数与__autoload有与曲同工之妙。都是当调用一个找不到的类的时候自动调用。
eg:
<?php
function loadprint( $class ) {
$file = $class . '.class.php';
if (is_file($file)) {
require_once($file);
}
}
class Loader {
public static function loadprint( $class ) {
$file = $class . '.class.php';
if (is_file($file)) {
require_once($file);
}
}
}
spl_autoload_register( 'loadprint' );
//spl_autoload_register( array('test','loadprint') );
//另一种写法:spl_autoload_register( "test::loadprint" );
但是spl_autoload_register()和__autoload还是有一定区别的
手册是这么说的
bool spl_autoload_register ([ callback $autoload_function ] )将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。因为spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或spl_autoload_call()。
个人理解:_autoload 已经不被推荐使用了,推荐使用 spl_autoload_register 来注册加载器。spl_autoload_register 相关的有一组函数可以更灵活地控制自动加载的具体行为。__autoload 只能存在一个,如果项目中使用的两个库都有 __autoload 就会出现冲突而无法运行,spl_autoload_register 则没有这个问题,多次使用 spl_autoload_register, 它会按顺序逐个调用加载器。如果已经使用了 spl_autoload_register, 那么 __autoload 会被忽略,除非你手动重新注册它
3.register_shutdown_function
也就是说当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会 被调用register_shutdown_function
所以,我们可以使用在脚本开始处设置一个变量为false,然后在脚本末尾将之设置为true的方法,让PHP关闭回调函数检查脚本完成与否. 如果我们的变量仍旧是false,我们就知道脚本的最后一行没有执行,因此它肯定在程序执行到某处死掉了.
register_shutdown_function 执行机制是:PHP把要调用的函数调入内存。当页面所有PHP语句都执行完成时,再调用此 函数。注意,在这个时候从内存中调用,不是从PHP页面中调用,所以上面的例子不能使用相对路径,因为PHP已经当原来的页面不存在了。就没有什么相对路 径可言。
注意:register_shutdown_function 是指在执行完所有PHP语句后再调用函数,不要理解成客户端关闭流浏览器页面时调用函数。
可以这样理解调用条件:
1、当页面被用户强制停止时
2、当程序代码运行超时时
3、当PHP代码执行完成时,代码执行存在异常和错误、警告
4.set_error_handler
PHP遇到错误时,就会给出出错脚本的位置、行数和原因 ,有些网管干脆把PHP配置文件中的display_errors设置为Off来解决(貌似我们就是这样做的),但本人认为这个方法过于消极。
- 可以用来屏蔽错误。 出现错误一来会把一些信息暴漏给用户,极有可能成为黑客攻击你网站的工具。 二来让用户觉得你的水平很挫。
- 可以记下错误的信息, 及时发现一些生产环境的出现的问题。
- 可以做相应的处理, 出错的时候可以显示跳转到预先定义好的出错页面,提供更好的用户体验。
- 可以作为调试工具, 一些时候必须在生产环境调试一些东西, 但又不想影响正在使用的用户。
语法
set_error_handler(error_function,error_types)
参数 | 描述 |
---|---|
error_function | 必需。规定发生错误时运行的函数。 |
error_types | 可选。规定在哪个错误报告级别会显示用户定义的错误。默认是 "E_ALL"。 |
使用set_error_handler()后,error_reporting ()将会失效,因为 如果使用了该函数,会完全绕过标准的 PHP 错误处理函数,如果必要,用户定义的错误处理程序必须终止 (die() ) 脚本。
自定义的错误处理函数一定要有这4个输入变量$errno(错误类型),$errstr(错误信息),$errfile(错误文件),$errline(错误行数),否则无效
1. * E_ERROR、 E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用最原始的方式显示出来。不过出现这些错误都是编译或PHP内核出错,在通常情况下不会发生。
2.* 使用set_error_handler()后,error_reporting ()将会失效。也就是所有的错误(除上述的错误)都会交给自定义的函数处理。
<?php
function errorHandle($errno, $errstr, $errfile, $errline)
{
var_dump($errno.'_'.$errstr.'_'.$errfile.'_'.$errline);
die();
}
//set error handler
set_error_handler("errorHandle");
$test=2;
var_dump($test/0);
5.set_exception_handler
set_exception_handler() 函数设置用户自定义的异常处理函数。
该函数用于创建运行时期间的用户自己的异常处理方法。
该函数会返回旧的异常处理程序,若失败,则返回 null。