说说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学习笔记 PHP面向对象的程序设计
Jun 13 PHP
php获取客户端电脑屏幕参数的方法
Jan 09 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
Feb 12 PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 PHP
PHP获取昨天、今天及明天日期的方法
Feb 03 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 PHP
PHP针对字符串开头和结尾的判断方法
Jul 11 PHP
PHP中file_put_contents追加和换行的实现方法
Apr 01 PHP
PHP性能分析工具xhprof的安装使用与注意事项
Dec 19 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
Jun 08 PHP
laravel添加前台跳转成功页面示例
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
php 无极分类(递归)实现代码
2010/01/05 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
优化JavaScript脚本的性能的几个注意事项
2006/12/22 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
SVG实现时钟效果
2018/07/17 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
整理Python最基本的操作字典的方法
2015/04/24 Python
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
python 字符串格式化的示例
2020/09/21 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
python中用ggplot绘制画图实例讲解
2021/01/26 Python
信息管理应届生求职信
2014/03/07 职场文书
绵山导游词
2015/02/05 职场文书
围城读书笔记
2015/06/26 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP