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 和 HTML
Oct 09 PHP
PHP编程网上资源导航
Oct 09 PHP
PHP 增加了对 .ZIP 文件的读取功能
Oct 09 PHP
php 高性能书写
Dec 11 PHP
PHP 设计模式之观察者模式介绍
Feb 22 PHP
fetchAll()与mysql_fetch_array()的区别详解
Jun 05 PHP
php将mysql数据库整库导出生成sql文件的具体实现
Jan 08 PHP
PHP图片等比例缩放生成缩略图函数分享
Jun 10 PHP
PHP中file_exists使用中遇到的问题小结
Apr 05 PHP
PHP实现文件上传下载实例
Oct 18 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
laravel withCount 统计关联数量的方法
Oct 10 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
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
2016/05/04 Javascript
JavaScript中函数声明与函数表达式的区别详解
2016/08/18 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
js判断节假日实例代码
2017/12/27 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
浅析vue中的nextTick
2020/12/28 Vue.js
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
python使用any判断一个对象是否为空的方法
2014/11/19 Python
python使用pymysql实现操作mysql
2016/09/13 Python
Python做文本按行去重的实现方法
2016/10/19 Python
Python Threading 线程/互斥锁/死锁/GIL锁
2019/07/21 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
大学教师年终总结的自我评价
2013/10/29 职场文书
毕业实习评语
2014/02/10 职场文书
合作经营协议书
2014/04/17 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
交通安全学习心得体会
2016/01/18 职场文书