Zend的AutoLoad机制介绍


Posted in PHP onSeptember 27, 2012

代码示例

set_include_path(USVN_LIB_DIR . PATH_SEPARATOR . get_include_path()); 
require_once 'Zend/Loader/Autoloader.php'; 
$autoloader = Zend_Loader_Autoloader::getInstance(); 
$autoloader->registerNamespace("Zend_"); 
$autoloader->registerNamespace("USVN_"); 
$autoloader->registerNamespace("menus_"); 
$config = new USVN_Config_Ini(USVN_CONFIG_FILE, USVN_CONFIG_SECTION);

过程分析

首先是设置了include_path,include_path就是php中调用include的时候文件寻找的地址
下面就是 require_once 'Zend/Loader/Autoloader.php';

在Zend/Loader/Autoloader.php文件内,读入了Zend/Loader.php, 这个php定义了Zend_Loader这个类,这个类包含了loadClass,loadFile, isReadable(文件是否可读)等函数
实例化Zend_Loader_Autoloader的过程就是调用其构造函数(这里是使用了单例模式)的过程

它的构造函数中的spl_autoload_register(array(__CLASS__, 'autoload'));将Zend_Loader_Autoloader:autoload作为类自动加载函数。
还做了一个操作将_internalAutoloader赋值了自身的_autoload

至于这里面是怎么autoload的等会根据具体例子查看
接下来调用了Zend_Loader_Autoloader:registerNamespace("USVN_"),这个函数做的事就只是在Zend_Loader_AutoLoader的内部属性_namespaces上挂载一个key为USVN_和value为true的值。

看到这个函数就明白其实代码也可以写成

$autoloader->registerNamespace("Zend_")->registerNamespace("USVN_")
或者
$autoloader->registerNamespace(array("Zend_","USVN_"))

好了,现在到调用 USVN_Config_Ini类了
这个类自然走的就是Zend_Loader_Autoloader:autoload("USVN_Config_Ini")
这个函数第一步会去调用getClassAutoloaders获取这个类的AutoLoader。getClassAutoloaders里面增加了对namespaceAutoloader的选择和判断,由于我们很少使用,直接跳过

这里返回的loader打印出来是这样的

Array ( [0] => Zend_Loader_Autoloader Object ( [_autoloaders:protected] => Array ( ) [_defaultAutoloader:protected] => Array ( [0] => Zend_Loader [1] => loadClass ) [_fallbackAutoloader:protected] => [_internalAutoloader:protected] => Array *RECURSION* [_namespaces:protected] => Array ( [Zend_] => 1 [ZendX_] => 1 [USVN_] => 1 [menus_] => 1 ) [_namespaceAutoloaders:protected] => Array ( ) [_suppressNotFoundWarnings:protected] => [_zfPath:protected] => ) [1] => _autoload )

其实就是前面设置的_internalAutoloader。

这里就会实际调用Zend_Loader_Autoloader:_autoload ("USVN_Config_Ini")
好了,现在就看到了Zend_Loader_Autoloader:_autoload函数

$callback = $this->getDefaultAutoloader();
这里会获取默认的Autoloader,什么是默认的Autoloader? 看这个类初始定义,实际上是array('Zend_Loader', 'loadClass');
下面自然就调用的是call_user_func($callback, $class);即Zend_Loader:loadClass("USVN_Config_Ini")

首先Zend_Loader已经在AutoLoader.php中被require了
其次我们看看Zend_Loader:loadClass方法,这个方法第一步是检查异常,跳过。第二步是将类分隔,拼凑成$file, 比如USVN/Config/Ini.php,下面就直接调用self::loadFile($file, null, true);

接下来查看self::loadFile,
首先_securityCheck看类名中是否有非法字符,没有,就include了这个$file。这里的$file当然是相对路径,需要拼接上include_path, 记得include_path是在哪里设置的吗?在程序的一开始就设置了!好了,这里就把USVN_Config_Ini这个类读取进来了。
看到这里你就该明白了,如果你自己定义了一个类,并且注册了Namespace,比如USVN,那么你就应该在include_path下面创建一个同名文件夹(大小写必须区分),然后你要引入的相对的文件路径名就是以类名的_做分隔读入的。

到这里AutoLoad机制就阅读完了。

PHP 相关文章推荐
php 什么是PEAR?(第二篇)
Mar 19 PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 PHP
paypal即时到账php实现代码
Nov 28 PHP
php计算十二星座的函数代码
Aug 21 PHP
谈谈关于php的优点与缺点
Apr 11 PHP
php调整gif动画图片尺寸示例代码分享
Dec 05 PHP
Codeigniter发送邮件的方法
Mar 19 PHP
php删除数组指定元素实现代码
May 03 PHP
PHP经典实用正则表达式小结
May 04 PHP
详解Yii2.0使用AR联表查询实例
Jun 16 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
thinkphp 框架数据库切换实现方法分析
May 18 PHP
说说PHP的autoLoad自动加载机制
Sep 27 #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
You might like
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
PHP4实际应用经验篇(7)
2006/10/09 PHP
php学习笔记 数组的常用函数
2011/06/13 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
a标签置灰不可点击的实现方法
2017/02/06 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
2018/01/23 Javascript
关于redux-saga中take使用方法详解
2018/02/27 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
Python FTP操作类代码分享
2014/05/13 Python
Python中的__slots__示例详解
2017/07/06 Python
Python探索之Metaclass初步了解
2017/10/28 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
django的ORM模型的实现原理
2019/03/04 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
python中pyqtgraph知识点总结
2021/01/26 Python
Python文件操作的面试题
2013/06/22 面试题
销售工作岗位职责
2013/12/24 职场文书
就业表自我评价分享
2014/02/06 职场文书
给校长的建议书100字
2014/05/16 职场文书
大学毕业生推荐信
2014/07/09 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python