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.MVC的模板标签系统(五)
Sep 05 PHP
php实现保存submit内容之后禁止刷新
Mar 19 PHP
C#使用PHP服务端的Web Service通信实例
Apr 08 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
Oct 08 PHP
PHPStrom 新建FTP项目以及在线操作教程
Oct 16 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
iOS+PHP注册登录系统 PHP部分(上)
Dec 26 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
Sep 29 PHP
php实现网页上一页下一页翻页过程详解
Jun 28 PHP
PHP下载文件函数与用法示例
Sep 27 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
追求程序速度,而不是编程的速度
2008/04/23 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
javascript for循环性能测试示例
2019/08/07 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
python中global与nonlocal比较
2014/11/21 Python
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
python二维键值数组生成转json的例子
2019/12/06 Python
Python rabbitMQ如何实现生产消费者模式
2020/08/24 Python
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
物理系毕业生自荐书范文
2014/02/22 职场文书
经典广告词大全
2014/03/14 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
涨价通知怎么写
2015/04/23 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
Python超详细分步解析随机漫步
2022/03/17 Python