最常常利用的便是这种方法,根据类名,找出类文件,然后require_one
复制代码
代码如下:
function __autoload($class_name) { $path = str_replace('_', '/', $class_name); require_once $path . '.php'; }
// 这里会自动加载Http/File/Interface.php 文件
$a = new Http_File_Interface();
这种方法的好处便是大略易利用。当然也有缺点,缺陷便是将类名和文件路径逼迫做了约定,当修正文件构造的时候,就势必要修正类名。
__autoload的利用方法2(直接映射法)
复制代码
代码如下:
$map = array( 'Http_File_Interface' => 'C:/PHP/HTTP/FILE/Interface.php' ); function __autoload($class_name) { if (isset($map[$class_name])) { require_once $map[$class_name]; } }
// 这里会自动加载C:/PHP/HTTP/FILE/Interface.php 文件
$a = new Http_File_Interface();
这种方法的好处便是类名和文件路径只是用一个映射来掩护,以是当文件构造改变的时候,不须要修正类名,只须要将映命中对应的项修正就好了。
这种方法相较于前面的方法缺陷是当文件多了的时候这个映射掩护起来非常麻烦,或许这时候你就会考虑利用json或者单独一个文件来进行掩护了。或许你会想到利用一个框架来掩护或者建立这么一个映射。
spl_autoload
__autoload的最大毛病是无法有多个autoload方法
好了, 想下下面的这个情景,你的项目引用了别人的一个项目,你的项目中有一个__autoload,别人的项目也有一个__autoload,这样两个__autoload就冲突了。办理的办法便是修正__autoload成为一个,这无疑是非常繁琐的。
因此我们急需利用一个autoload调用堆栈,这样spl的autoload系列函数就涌现了。你可以利用spl_autoload_register注册多个自定义的autoload函数
如果你的PHP版今年夜于5.1的话,你就可以利用spl_autoload
先理解spl的几个函数:
spl_autoload 是_autoload()的默认实现,它会去include_path中探求$class_name(.php/.inc)
Spl_autoload实现自动加载:
复制代码
代码如下:
/http.php/ <?php class http { public function callname(){ echo \"大众this is http\公众; } } /test.php/ <?php set_include_path(\公众/home/yejianfeng/handcode/\"大众); //这里须要将路径放入include spl_autoload(\"大众http\"大众); //探求/home/yejianfeng/handcode/http.php $a = new http(); $a->callname();
Spl_autoload_register
将函数注册到SPL __autoload函数栈中,直接看一个例子:
复制代码
代码如下:
/http.php/ <?php class http { public function callname(){ echo \公众this is http\"大众; } } /test.php/ <?php spl_autoload_register(function($class){ if($class == 'http'){ require_once(\"大众/home/yejianfeng/handcode/http.php\"大众); } }); $a = new http(); $a->callname();
spl_autoload_call
调用spl_autoload_register中注册的调用函数, 看下面的例子
复制代码
代码如下:
/http.php/ <?php class http { public function callname(){ echo \公众this is http\"大众; } } /http2.php/ <?php class http { public function callname(){ echo \"大众this is http2\"大众; } } /test.php/ <?php spl_autoload_register(function($class){ if($class == 'http'){ require_once(\"大众/home/yejianfeng/handcode/http.php\"大众); } if($class == 'http2'){ require_once(\公众/home/yejianfeng/handcode/http2.php\"大众); } }); spl_auto_call('http2'); $a = new http(); $a->callname(); //这个时候会输出\"大众this is http2\公众
spl_auto_register这个函数使得我们不该用__autoload,利用自定义的函数来进行自动加载成为可能。这个方法现在是常常利用到的。
Zend的AutoLoader模块就利用了这个方法。摘录个中对应的代码
复制代码
代码如下:
spl_autoload_register(array(__CLASS__, 'autoload')); public static function autoload($class) { ….. }