博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP autoload自动加载机制
阅读量:4611 次
发布时间:2019-06-09

本文共 1889 字,大约阅读时间需要 6 分钟。

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

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

魔术函数__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();

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

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

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();

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

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

-----------------------------------

spl_autoload

__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 
callname();

 

spl_autoload_register()

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

1 /*http.php*/ 2 
callname();

 

spl_autoload_call()

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

1 /*http.php*/ 2 
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 }

 

转载于:https://www.cnblogs.com/deverz/p/6137547.html

你可能感兴趣的文章
关于微信公众平台测试号配置失败的问题
查看>>
【NOIP2001】统计单词个数
查看>>
linux常用端口
查看>>
异常处理
查看>>
/proc/uptime详解
查看>>
如何建立合适的索引?
查看>>
acwing 651. 逛画展
查看>>
(待完成)qbxt2019.05 总结12 - 趣味题目 鹰蛋
查看>>
[2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
查看>>
关于WPF程序只运行一个实例的方法
查看>>
局域网内访问机器时出现“未授予在次计算机上的请求登陆类型”
查看>>
Bogart BogartAutoCode.vb
查看>>
JavaScript面试题
查看>>
[转帖]架构师眼中的高并发架构
查看>>
ios的一些开源资源
查看>>
HTTP 错误 500.21 - Internal Server Error 解决方案
查看>>
Bucks sign Sanders to $44 million extension
查看>>
【PHP】Windows下配置用mail()发送邮件
查看>>
人类简史
查看>>
java 设计模式学习
查看>>