9.4 自动加载
很多时候写面向对象的应用程序时对每个类的定义建立一个PHP源文件。一个很大的烦恼是不得不在每个脚本开头写一个长长的包含文件列表(每个类一个文件),对于每一个类文件都需要使用require或者include引入。PHP中提供了两个可用来自动加载文件的函数__autoload()和spl_autoload_register()函数。
9.4.1 __autoload() 方法
当在代码中尝试加载未定义的类时会触发__autoload()函数,语法如下:
void __autoload(string $class)
其中,class是待加载的类名,该函数没有返回值。
下面演示如何使用__autoload()方法。假设有两个文件,分别为myclass.php和yourclass.php, myclass.php代码:3
myclass.php代码:
<?php
class myclass{
function myname(){
echo "My name is chenxiaolong<br/>";
}
}
yourclass.php代码:
<?php
class yourclass{
function myname(){
echo "Your name is lixiaolong<br/>";
}
}
另外,在同一目录下写一个autoload.php文件,代码如下:
<?php
/*
*void __autoload(string $class),class是待加载的类名,该函数没有返回值
*
* */
function __autoload($name){
if(file_exists($name.".php")){
require_once $name.'.php';
}else
{
echo "The path is error";
}
}
$my = new myclass();
$my->myname();
$your = new yourclass();
$your->myname();
执行autoload.php文件,输出结果为:
My name is chenxiaolong
Your name is lixiaolong
当语句运行到$my = new myclass()和$your = new yourclass()时便会调用__autoload()函数,在__autoload()函数里实现了把相应类文件加载进来的功能。
9.4.2 spl_autoload_register() 函数
PHP还提供了spl_autoload_register()函数,可实现自动加载,以及注册给定的函数作为__autoload()的实现。spl_autoload_register()函数语法如下:
spl_autoload_register ([ callable $autoload_function
[, bool $throw
= true
[, bool $prepend
= false
]]] ) : bool
说明:autoload_function是要注册的自动装载函数。若没有提供任何参数,则自动注册autoload的默认实现函数spl_autoload()。throw参数设置了autoload_function无法成功注册时spl_autoload_register()是否抛出异常,若throw为true或未设置值,则抛出异常,为false则不抛出。prepend如果为true,spl_autoload_register()会添加函数到队列之首,而不是队列尾部。
假设当前目录下存在myclass.php和yourclass.php,并且两个文件中的代码和上例相同,此时我们将autoload.php中的代码改为如下内容:
<?php
/*
*
*
* */
function my_autoloader($class){
include $class.'.php';
}
//spl_autoload_register('my_autoloader');
//自PHP 5.3.0起,可以使用一个匿名函数
spl_autoload_register(function ($class){
include $class.'.php';
});
$my = new myclass();
$my->myname();
$your = new yourclass();
$your->myname();
此时运行autoload.php,执行结果为:
My name is chenxiaolong
Your name is lixiaolong