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 相关文章推荐
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
Jun 08 PHP
PHP查询MySQL大量数据的时候内存占用分析
Jul 22 PHP
PHP通过正则表达式下载图片到本地的实现代码
Sep 19 PHP
php 解压rar文件及zip文件的方法
May 05 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
Mar 05 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
php实现的三个常用加密解密功能函数示例
Nov 06 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
PDO::exec讲解
Jan 28 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 PHP
PHP手机号码及邮箱正则表达式实例解析
Jul 11 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
写一个用户在线显示的程序
2006/10/09 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
Quasar Input:type="number" 去掉上下小箭头 实现加减按钮样式功能
2020/04/09 Javascript
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
详解python中executemany和序列的使用方法
2017/08/12 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
详解Python3中的 input() 函数
2020/03/18 Python
python从Oracle读取数据生成图表
2020/10/14 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
车间主管岗位职责
2013/11/14 职场文书
应届生简历中的自我评价
2014/01/13 职场文书
运动会广播稿400字
2014/01/25 职场文书
关爱女孩行动实施方案
2014/03/13 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
Python+pyaudio实现音频控制示例详解
2022/07/23 Python