说说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与XML联手进行网站编程代码实例
Jul 10 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
php抓取页面与代码解析 推荐
Jul 23 PHP
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
PHP include_path设置技巧分享
Jul 03 PHP
php与java通过socket通信的实现代码
Oct 21 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
PHP中使用break跳出多重循环代码实例
Jan 21 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
PHP 计算两个特别大的整数实例代码
May 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数据缓存的使用说明
2013/05/10 PHP
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
JS中sort函数排序用法实例分析
2016/06/16 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
python 的列表遍历删除实现代码
2020/04/12 Python
Python 数据结构之队列的实现
2017/01/22 Python
Python之批量创建文件的实例讲解
2018/05/10 Python
python抽取指定url页面的title方法
2018/05/11 Python
实例讲解Python爬取网页数据
2018/07/08 Python
使用pip安装python库的多种方式
2019/07/31 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
基于python的列表list和集合set操作
2019/11/24 Python
学习党章思想汇报
2014/01/07 职场文书
九年级体育教学反思
2014/01/23 职场文书
财务工作犯错检讨书
2014/10/07 职场文书
接收函格式
2015/01/30 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
中学推普周活动总结
2015/05/07 职场文书
在职证明范本
2015/06/15 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
导游词之麻姑仙境
2019/11/18 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
python中redis包操作数据库的教程
2022/04/19 Python