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 相关文章推荐
一个简单实现多条件查询的例子
Oct 09 PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 PHP
鸡肋的PHP单例模式应用详解
Jun 03 PHP
php简单实现无限分类树形列表的方法
Mar 27 PHP
PHP加密解密类实例分析
Apr 20 PHP
Yii中表单用法实例详解
Jan 05 PHP
PHP导出Excel实例讲解
Jan 24 PHP
PHP解压tar.gz格式文件的方法
Feb 14 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
php给数组赋值的实例方法
Sep 26 PHP
Laravel实现批量更新多条数据
Apr 06 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
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
快速掌握jQuery插件开发
2017/01/19 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
详解nodejs express下使用redis管理session
2017/04/24 NodeJs
javascript获取指定区间范围随机数的方法
2017/09/08 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
python生成日历实例解析
2014/08/21 Python
浅析Python中的序列化存储的方法
2015/04/28 Python
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
python爬虫基本知识
2018/03/05 Python
点球小游戏python脚本
2018/05/22 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
教你利用Python玩转histogram直方图的五种方法
2018/07/30 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
《月光启蒙》教学反思
2014/03/01 职场文书
一帮一活动总结
2014/05/08 职场文书
大国崛起英国观后感
2015/06/02 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书
预备党员入党思想汇报(范文)
2019/08/14 职场文书
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python