_autoload() 函数在PHP文档中的解释是试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
如何理解这句话,我们首先看下面一个简单的例子:
首先定义ClassA和ClassB两个类,其中ClassB继承ClassA。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
//定义一个类ClassA,文件名为ClassA.php
class
ClassA{
public
function
__construct(){
echo
"ClassA load success!"
;
}
}
//定义一个类ClassB,文件名为ClassB.php,ClassB继承ClassA
class
ClassB
extends
ClassA {
public
function
__construct(){
//parent::__construct();
echo
"ClassB load success!"
;
}
}
?>
|
下面我们使用__autoload()加载这两个类:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php
function
__autoload(
$classname
){
$classpath
=
"./"
.
$classname
.
'.php'
;
if
(
file_exists
(
$classpath
)){
require_once
(
$classpath
);
}
else
{
echo
'class file'
.
$classpath
.
'not found!'
;
}
}
$newobj
=
new
ClassA();
$newobj
=
new
ClassB();
?>
|
上面代码输出:
ClassA load success!
ClassB load success!
说明当我们实例化一个类是自动调用__autoload()函数
用这种方法加载类是不是很简单呢,但是这里需要注意以下几点:
1、如果类存在继承关系,那么继承者和被继承者要在同一个目录下。
2、使用__autoload函数时,类名和类的文件名必须一致。
3、在CLI模式下运行PHP脚本的话这个方法无效
当我们开发大型应用程序时,会有很多类需要加载,此时如果再使用__autoload()函数来加载的话程序就会显得很臃肿。大家在阅读PHP手册关于__autoload()函数时可能会注意到有这样一句话:spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。下面我们看看spl_autoload_register()有哪些优势。
官方手册对spl_autoload_register()函数是这样解释的: 注册__autoload()函数。
这样很难理解,下面我们看一个实例:
|
1
2
3
4
5
6
7
8
9
10
11
|
<?php
function
loadprint( $
class
) {
$file = $
class
.
'.class.php'
;
if
(is_file($file)) {
require_once($file);
}
}
spl_autoload_register(
'loadprint'
);
$obj =
new
PRINTIT();
$obj->doPrint();
?>
|
在代码中我们将__autoload替换成loadprint,此时loadprint()函数不会自动调用,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadprint()。
因此,当我们不想自动加载的时候调用__autoload,而是调用我们自己的函数(或者类方法),我们可以使用spl_autoload_register来注册我们自己的autoload函数。




