源码地址:https://github.com/wilfordw/phpTutorial
该系列我只写我的理解,非官方解释,如不够专业请见谅
_autoload
作为一个面向对象语言,经常需要用new
实例化类对象,但如果new另一个文件中的类对象,那首先要把文件加载进来(require_once
)。如果每次new都要这样一个过程话,会非常繁琐,于是我们可以用php的自动加载功能定制特定加载规则。
ClassA.php
<?php
class ClassA{
public function __construct(){
echo "ClassA load success!";
}
}
ClassB.php
<?php
class ClassB extends ClassA {
public function __construct(){
parent::__construct();
echo "ClassB load success!";
}
}
_autoload.php
<?php
function __autoload($classname){
$classpath = './'.$classname.'.php';
if(file_exists($classpath)){
require_once($classpath);
}else{
echo 'class file'.$classpath.' not found';
}
}
new ClassA();//输出 ClassA load success!
new ClassB();//输出 ClassA load success!ClassB load success!
new ClassC();//输出 class file./ClassC.php not found
如上 只要在同一目录下就可以直接加载该目录已有的类。不过根据当前规则,类名必须要和文件名一致,加载目录下没有的类会报错。同时整个php生命周期内只能有一个__autoload
函数,所以使用很有局限性,很难把控,目前已经基本弃用,被spl_autoload
所代替
spl_autoload
spl_autoload
引入自定义注册机制,这样就避免了__autoload
全局唯一引发冲突的尴尬,需要的使用调用bool spl_autoload_register ( [callback $autoload_function] )
注册 ,不用了调用bool spl_autoload_unregister ( mixed $autoload_function )
注销
<?php
class LOAD
{
static function loadClass($class_name)
{
$filename = $class_name.".php";
if (is_file($filename)) return require_once $filename;
}
}
/**
* 设置对象的自动载入
* spl_autoload_register — Register given function as __autoload() implementation
*/
spl_autoload_register(array('LOAD', 'loadClass'));
new ClassA();//实现自动加载,很多框架就用这种方法自动加载类
spl_autoload_unregister(array('LOAD', 'loadClass'));
以上就用了spl_autoload
注册自动加载,实现加载ClassA,然后注销自动加载
该例子中由于是注册LOAD类中的loadClass,用了array('LOAD', 'loadClass'),如果只是调用脚本中的函数就直接可用函数名spl_autoload_register( 'loadClass')