php spl_autoload_register 类的自动加载
概述
SPL
是 PHP 标准库(Standard PHP Library)的一个组件,它提供了一组用于解决各种常见问题的标准 PHP 类和接口。
__autoload
是一个 PHP 魔术方法,它在 PHP 5.0.0 版本引入,用于自动加载类和接口。
__autoload
是指使用 SPL
中的自动加载器 spl_autoload_register()
来自动加载 PHP 类和接口的过程。
__autoload
是早期的自动加载方法,已被 spl_autoload_register()
取代,
因为它只能注册一个自动加载函数,而 spl_autoload_register()
可以注册多个函数,并且提供了更多的灵活性和可扩展性
SPL
中的自动加载器 spl_autoload_register()
可以注册一个或多个自动加载函数,用于在需要时自动加载类和接口。当 PHP 代码尝试使用尚未定义的类或接口时,spl_autoload_register()
将遍历已注册的自动加载函数列表,尝试使用其中一个函数来加载所需的类或接口。
spl_autoload_register()有三个参数
autoload_function
这是一个函数【方法】名称,可以是字符串或者数组(调用类方法使用)。这个函数(方法)的功能就是,来把需要new 的类文件包含include(requeire)进来,这样new的时候就不会找不到文件了。其实就是封装整个项目的include和require功能。
throw
此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。
prepend
如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。
当我们new一个类,并且这个类文件没有被包含时候就会执行这个autoload_function方法:
先来看一个错误例子:
//当我们直接new一个未包含class类文件时候会报错
$objDemo = new AutoloadClass();
/**
Fatal error: Uncaught Error: Class 'AutoloadClass' not found in E:\work\demo\spl\autoloadDemo.php on line 3
Error: Class 'AutoloadClass' not found in E:\work\demo\spl\autoloadDemo.php on line 3
*/
简单点说,
spl_autoload_register函数是实现自动加载未定义类功能的的重要方法,
所谓的自动加载意思就是 我们的new 一个类的时候必须先include或者require的类文件,如果没有include或者require,则会报错。
那这样我们就必须在文件头部写上许多include或require文件,非常麻烦,
为了使得没有include或者require类的时候也正常new一个类,所以有了自动加载的概念,也就是说new一个类之前不用事先包含类文件也可以正常new,这样我们的文件头部就不用包含许多include(require)。其实这算一种封装!
__autoload
这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。看下面例子:
printit.class.php:
<?php
class PRINTIT {
function doPrint() {
echo 'hello world';
}
}
?>
index.php
<?
function __autoload( $class ) {
$file = $class . '.class.php';
if ( is_file($file) ) {
require_once($file);
}
}
$obj = new PRINTIT();
$obj->doPrint();?>
运行index.php后正常输出hello world。在index.php中,由于没有包含printit.class.php,在实例化printit时,自动调用__autoload函数,参数$class的值即为类名printit,此时printit.class.php就被引进来了。
spl_autoload_register()
再看spl_autoload_register(),这个函数与__autoload有与曲同工之妙,看个简单的例子:
<?
//$class就是不存在的类名(小写)
function loadprint( $class ) {
//类文件名
$file = $class . '.class.php';
if (is_file($file)) {
//引入
require_once($file);
}
}
//告诉PHP在不存在类时该执行哪个方法
spl_autoload_register( 'loadprint' );
$obj = new PRINTIT();
$obj->doPrint();?>
将__autoload换成loadprint函数。但是loadprint不会像__autoload自动触发,
这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadprint()。
匿名调用
spl_autoload_register(function ($className)
{
//类文件名 $file = $class . '.class.php'; if (is_file($file)) {
//引入 require_once($file);
}, true, true);
$objDemo = new PRINTIT();
spl_autoload_register() 调用静态方法
<?
class test {
public static function loadprint( $class ) {
$file = $class . '.class.php';
if (is_file($file)) {
require_once($file);
}
}
}
spl_autoload_register( array('test','loadprint') );
//另一种写法:spl_autoload_register( "test::loadprint" );
$obj = new PRINTIT();
$obj->doPrint();?>
版权声明:
作者:linrux
链接:https://www.tot7.cn/technology/php/453.html
来源:阿信博客
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论