说说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 防止单引号,双引号在接受页面转义
Jul 10 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
Jul 29 PHP
php在文件指定行中写入代码的方法
May 23 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
php对二维数组进行排序的简单实例
Dec 19 PHP
php使用gzip压缩传输js和css文件的方法
Jul 29 PHP
php关键字仅替换一次的实现函数
Oct 29 PHP
完美解决thinkphp唯一索引重复时出错的问题
Mar 31 PHP
Mac下php 5升级到php 7的步骤详解
Apr 26 PHP
PHP守护进程化在C和PHP环境下的实现
Nov 21 PHP
Yii框架页面渲染操作实例详解
Jul 19 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 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
Php+SqlServer实现分页显示
2006/10/09 PHP
基于mysql的bbs设计(二)
2006/10/09 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
php安装swoole扩展的方法
2015/03/19 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
js对象的复制继承实例
2015/01/10 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
js中获取 table节点各tr及td的内容简单实例
2016/10/14 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
vue router 配置路由的方法
2018/07/26 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
Python中return语句用法实例分析
2015/08/04 Python
使用Python生成XML的方法实例
2017/03/21 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
用python实现一个简单的验证码
2020/12/09 Python
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
如何写自我鉴定
2014/03/19 职场文书
家长会学生演讲稿
2014/04/26 职场文书
大型演出策划方案
2014/05/28 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
中班教师个人总结
2015/02/05 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
如何撰写创业策划书
2019/06/27 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书