说说PHP的autoLoad自动加载机制


Posted in PHP onSeptember 27, 2012

__autoload的使用方法1:
最经常使用的就是这种方法,根据类名,找出类文件,然后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的几个函数:
说说PHP的autoLoad自动加载机制

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) 
{ 
….. 
}

建议参考文章:
关于zend的autoload机制,前面有篇文章https://3water.com/article/31399.htm 有详细分析。
关于autoload的自动加载机制,这篇文章https://3water.com/article/31279.htm说得非常详细,从底层开始分析。

PHP 相关文章推荐
PHP JSON格式数据交互实例代码详解
Jan 13 PHP
php字符串分割函数explode的实例代码
Feb 07 PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 PHP
ThinkPHP3.1.3版本新特性概述
Jun 19 PHP
php中smarty变量修饰用法实例分析
Jun 11 PHP
PHP封装CURL扩展类实例
Jul 28 PHP
PHP中利用sleep函数实现定时执行功能实现代码
Aug 25 PHP
完美解决Thinkphp3.2中插入相同数据的问题
Aug 01 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 PHP
PHP实现常用排序算法的方法
Feb 05 PHP
PHP如何通过带尾指针的链表实现'队列'
Oct 22 PHP
php FLEA中二叉树数组的遍历输出
Sep 26 #PHP
PHP fopen 读取带中文URL地址的一点见解
Sep 25 #PHP
PHP可逆加密/解密函数分享
Sep 25 #PHP
将时间以距今多久的形式表示,PHP,js双版本
Sep 25 #PHP
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 #PHP
PHP获取网址的顶级域名函数代码
Sep 24 #PHP
ThinkPHP关联模型操作实例分析
Sep 23 #PHP
You might like
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
PHP的AES加密算法完整实例
2016/07/20 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
2015/10/09 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)
2017/09/15 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
Python实现自动上京东抢手机
2018/02/06 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
python3 实现口罩抽签的功能
2020/03/11 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
python list的index()和find()的实现
2020/11/16 Python
小区文明倡议书
2014/05/16 职场文书
酒店餐厅2014重阳节活动策划方案
2014/09/16 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
php 解析非标准json、非规范json
2021/04/01 PHP
详解MySQL中的pid与socket
2021/06/15 MySQL
python Tkinter模块使用方法详解
2022/04/07 Python
Mysql中mvcc各场景理解应用
2022/08/05 MySQL