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 相关文章推荐
wiki-shan写的php在线加密的解密程序
Sep 07 PHP
php empty函数判断mysql表单是否为空
Apr 12 PHP
php 操作调试的方法
Jul 12 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
May 11 PHP
php读取txt文件并将数据插入到数据库
Feb 23 PHP
浅谈PHP Cookie处理函数
Jun 10 PHP
php倒计时出现-0情况的解决方法
Jul 28 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
Oct 08 PHP
php利用gd库为图片添加水印
Nov 09 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 PHP
php实现的数组转xml案例分析
Sep 28 PHP
php操作redis数据库常见方法实例总结
Feb 20 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
实用函数9
2007/11/08 PHP
php入门之连接mysql数据库的一个类
2012/04/21 PHP
初识PHP中的Swoole
2016/04/05 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
JavaScript"模拟事件"的注意要点详解
2019/02/13 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
如何基于python操作excel并获取内容
2019/12/24 Python
Python基于paramunittest模块实现excl参数化
2020/04/26 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
美国老牌主机服务商:iPage
2016/07/22 全球购物
巴西网上药房:onofre
2016/11/21 全球购物
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
策划总监岗位职责
2014/02/16 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
高三复习计划
2015/01/19 职场文书
辞职信如何写
2015/02/27 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
毕业设计致谢语
2015/05/14 职场文书
小学安全工作总结2015
2015/05/18 职场文书
《包身工》教学反思
2016/02/23 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers