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
链接:http://www.tot7.cn/technology/php/453.html
来源:阿信博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录