__autoload() 当调用了某个函数或实例化类,而在本文件中找不到时执行。
通过有规律的名字可以使用__autoload()函数自动载入需要的文件。
例如在action文件夹下有三个文件:
arcAction.php channelAction.php modelAction.php
这三个文件中包含了一个各自对应的类,类名与文件名相同。(只要有一定规律,可以通过字符串拼接得到即可)
在与action文件夹同级的目录common文件夹下有一个Action.php文件,
现在想在Action.php文件中访问action下三个文件中的类,直接的做法是将三个文件都
include一次。但是如果这三个文件之间也要进行类的访问的话,又得彼此include,
一旦目录名更改,修改起来非常麻烦。此时如果使用__autoload()函数就十分方便:
在action所在的文件夹下新建一个index.php文件,用于目录管理:
index.php
<?php
function __autoload($classname){
include './action/'.$classname.'.php';
}
$a = isset($_GET['a'])?$_GET['a'].'Action':'index';
$action = new $a();
?>
这样,如果通过GET方法获得字符串arc,那么$a的值就是arcAction,
而在index.php中找不到arcAction这个类,这时就会自动执行__autoload()函数,
$a作为参数$classname被传递到__autoload函数内,拼接后的字符串是这样:
'./action/arcAction.php'
这时使用include函数,就会在action文件夹下找到arcAction.php文件,引入。
而arcAction.php中存在名为arcAction的类,引入后在index.php中自然就可以访问
arcAction.php中的类了。这时的index.php就起着类似目录管理的作用。
只要是通过index.php文件访问action目录下的文件,index.php都会将其自动载入。
当其他文件想要访问action目录中的文件时,只要把index.php引入即可。
spl_autoload_register() 功能与__autoload一样,只不过可以自定义函数名称。
当使用spl_autoload_register定义了执行函数之后,当找不到某个函数或类的时候,
将会执行自定义函数,而不是__autoload()。
例如:
spl_autoload_register('load_auto');
spl_autoload_register(array('load','loadauto'));
上面一行指定以自定义的load_auto函数代替__autoload函数,下面一行则是指定类load的方法loadauto
来执行。注意此时类的方法loadauto要定义成静态的(public static)。
可以在类中定义自动载入函数:
class x{
function __construct(){
$this->config();
}
public static function load($filepath){
include "{filepath}";
}
public function config(){
spl_autoload_register(array(__CLASS__,'load'));
}
}