PHP autoload自动加载机制

原文地址: http://www.jb51.net/article/31399.htmphp

一直不是很明白__autoload()和spl_autoload_register()到底有什么不一样,找到了一个问章,介绍的很好,做为参考。json

魔术函数__autoload()和spl_autoload_register()的区别:框架

__autoload的使用方法1:
最常常使用的就是这种方法,根据类名,找出类文件,而后require_one。函数

1 function __autoload($class_name) {
2   $path = str_replace('_', '/', $class_name);
3   require_once $path . '.php';
4 }
5 // 这里会自动加载Http/File/Interface.php 文件
6 $a = new Http_File_Interface(); 

这种方法的好处就是简单易使用。固然也有缺点,缺点就是将类名和文件路径强制作了约定,当修改文件结构的时候,就势必要修改类名。ui

__autoload的使用方法2(直接映射法)this

 1 $map = array(
 2   'Http_File_Interface' => 'C:/PHP/HTTP/FILE/Interface.php'
 3 );
 4 function __autoload($class_name) {
 5   if (isset($map[$class_name])) {
 6   require_once $map[$class_name];
 7   }
 8 }
 9 // 这里会自动加载C:/PHP/HTTP/FILE/Interface.php 文件
10 $a = new Http_File_Interface(); 

这种方法的好处就是类名和文件路径只是用一个映射来维护,因此当文件结构改变的时候,不须要修改类名,只须要将映射中对应的项修改就行了。spa

这种方法相较于前面的方法缺点是当文件多了的时候这个映射维护起来很是麻烦,或许这时候你就会考虑使用json或者单独一个文件来进行维护了。或许你会想到使用一个框架来维护或者创建这么一个映射。.net

-----------------------------------code

spl_autoloadhtm


__autoload的最大缺陷是没法有多个autoload方法

好了, 想下下面的这个情景,你的项目引用了别人的一个项目,你的项目中有一个__autoload,别人的项目也有一个__autoload,这样两个__autoload就冲突了。解决的办法就是修改__autoload成为一个,这无疑是很是繁琐的。

所以咱们急需使用一个autoload调用堆栈,这样spl的autoload系列函数就出现了。你可使用spl_autoload_register注册多个自定义的autoload函数。

若是你的PHP版本大于5.1的话,你就可使用spl_autoload。

 

spl_autoload() 是_autoload()的默认实现,它会去include_path中寻找$class_name(.php/.inc)
spl_autoload()实现自动加载:

 1 /*http.php*/
 2 <?php
 3 class http{
 4     public function callname(){
 5     echo "this is http";
 6     }
 7 }
8 /*test.php*/ 9 <?php 10 set_include_path("/home/yejianfeng/handcode/"); //这里须要将路径放入include 11 spl_autoload("http"); //寻找/home/yejianfeng/handcode/http.php 12 $a = new http(); 13 $a->callname();

 

spl_autoload_register()
将函数注册到 SPL __autoload 函数栈中,直接看一个例子:

 1 /*http.php*/
 2 <?php
 3 class http{
 4     public function callname(){
 5     echo "this is http";
 6     }
 7 }
 8 
 9 /*test.php*/
10 <?php
11 spl_autoload_register(function($class){
12     if($class == 'http'){
13     require_once("/home/yejianfeng/handcode/http.php");
14     }
15 });
16 
17 $a = new http();
18 $a->callname(); 

 

spl_autoload_call()
调用spl_autoload_register()中注册的调用函数, 看下面的例子

 1 /*http.php*/
 2 <?php
 3 class http{
 4     public function callname(){
 5     echo "this is http";
 6     }
 7 }
 8 
 9 /*http2.php*/
10 <?php
11 class http{
12     public function callname(){
13     echo "this is http2";
14     }
15 }
16 
17 /*test.php*/
18 <?php
19 spl_autoload_register(function($class){
20     if($class == 'http'){
21     require_once("/home/yejianfeng/handcode/http.php");
22 }
23   if($class == 'http2'){
24     require_once("/home/yejianfeng/handcode/http2.php");
25     }
26 });
27 spl_auto_call('http2');
28 $a = new http();
29 $a->callname(); //这个时候会输出"this is http2" 

 

spl_auto_register()这个函数使得咱们不使用__autoload(),使用自定义的函数来进行自动加载成为可能。这个方法如今是常常使用到的。
Zend的AutoLoader模块就使用了这个方法。摘录其中对应的代码

1 spl_autoload_register(array(__CLASS__, 'autoload'));
2 
3 public static function autoload($class){
4     //...
5 } 
相关文章
相关标签/搜索