说说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 gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
Aug 18 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
ioncube_loader_win_5.2.dll的错误解决方法
Jan 04 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
Mar 27 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
Nov 01 PHP
简述php环境搭建与配置
Dec 05 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP的介绍以及优势详细分析
Sep 05 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
Oct 09 PHP
Laravel 验证码认证学习记录小结
Dec 20 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小偷的核心程序
2007/04/09 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
PHP 万年历实现代码
2012/10/18 PHP
php实现文件下载更能介绍
2012/11/23 PHP
yii2缓存Caching基本用法示例
2016/07/18 PHP
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
修复IE9&amp;safari 的sort方法
2011/10/21 Javascript
浅析JavaScript中的隐式类型转换
2013/12/05 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
python魔法方法-属性访问控制详解
2016/07/25 Python
python爬虫使用cookie登录详解
2017/12/27 Python
Python实现PS图像抽象画风效果的方法
2018/01/23 Python
分享一下Python数据分析常用的8款工具
2018/04/29 Python
Python装饰器基础概念与用法详解
2018/12/22 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
西班牙著名的珠宝首饰品牌:P D PAOLA
2018/09/15 全球购物
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
档案管理员岗位职责
2013/12/01 职场文书
舞蹈教师自荐信
2014/01/27 职场文书
教师对学生的寄语
2014/04/03 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
辩护词格式
2015/05/22 职场文书
《莫泊桑拜师》教学反思
2016/02/22 职场文书