说说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插件 Simple HTML DOM 用DOM方式处理HTML
Jul 01 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
Sep 30 PHP
php将mysql数据库整库导出生成sql文件的具体实现
Jan 08 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
PHP中Http协议post请求参数
Nov 02 PHP
php上传图片类及用法示例
May 11 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 PHP
PHP设计模式之工厂模式实例总结
Sep 01 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
Sep 08 PHP
laravel框架邮箱认证实现方法详解
Nov 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教程 插件机制在PHP中实现方案
2012/11/02 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
使用php判断网页是否gzip压缩
2013/06/25 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
2014/10/08 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
2016/05/10 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
python绘制中国大陆人口热力图
2018/11/07 Python
Python之循环结构
2019/01/15 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
室内拓展活动方案
2014/02/13 职场文书
党的群众路线教育实践活动对照检查材料(教师)
2014/09/24 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
销售助理岗位职责
2015/02/11 职场文书
个人催款函范文
2015/06/23 职场文书
python 调用js的四种方式
2021/04/11 Python