PHP中一些重要的函数总结

时间:2021-06-26 21:18:04

_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);

执行结果如下

PHP中一些重要的函数总结

解析:脚步在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来解决(貌似我们就是这样做的),但本人认为这个方法过于消极。  

  1. 可以用来屏蔽错误。 出现错误一来会把一些信息暴漏给用户,极有可能成为黑客攻击你网站的工具。 二来让用户觉得你的水平很挫。
  2. 可以记下错误的信息, 及时发现一些生产环境的出现的问题。
  3. 可以做相应的处理, 出错的时候可以显示跳转到预先定义好的出错页面,提供更好的用户体验。 
  4. 可以作为调试工具, 一些时候必须在生产环境调试一些东西, 但又不想影响正在使用的用户。

语法

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);
PHP中一些重要的函数总结

5.set_exception_handler

set_exception_handler() 函数设置用户自定义的异常处理函数。

该函数用于创建运行时期间的用户自己的异常处理方法。

该函数会返回旧的异常处理程序,若失败,则返回 null。