说说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 17 PHP
drupal 代码实现URL重写
May 04 PHP
php写的简易聊天室代码
Jun 04 PHP
php字符编码转换之gb2312转为utf8
Oct 28 PHP
destoon出现验证码不显示时的紧急处理方法
Aug 22 PHP
PHP转盘抽奖接口实例
Feb 09 PHP
PHP判断是否连接上网络的方法
Jul 01 PHP
PHP实现的构造sql语句类实例
Feb 03 PHP
php 防止表单重复提交两种实现方法
Nov 03 PHP
PHP使用curl制作简易百度搜索
Nov 03 PHP
php基于curl重写file_get_contents函数实例
Nov 08 PHP
PHP编程中的Session阻塞问题与解决方法分析
Aug 07 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生成QRcode实例
2014/09/22 PHP
PHP在线书签系统分享
2016/01/04 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
js实现日期级联效果
2014/01/23 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
js面向对象编程总结
2017/02/16 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
如何通过python实现全排列
2020/02/11 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
写给女生的道歉信
2014/01/08 职场文书
环保专业大学生职业规划设计
2014/01/10 职场文书
党员干部承诺书范文
2014/03/25 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
如何写辞职书
2015/02/26 职场文书
学生会自荐信
2019/05/16 职场文书