基于Zend的Config机制的应用分析


Posted in PHP onMay 02, 2013

Zend的Config类在Zend_Config_Ini

代码
$config = new Zend_Config_Ini("/var/www/html/usvn/config/config.ini", "general");

date_default_timezone_set($config->timezone);

USVN_ConsoleUtils::setLocale($config->system->locale);

===

Config.ini文件内容

[general]

url.base = "/usvn"

translation.locale = "zh_CN"

timezone = "Asia/Shanghai"

具体分析
这里只使用了Zend_Config_Ini的构造函数,我们看到它的__construct中。

首先是判断是否有配置文件。其次是对option进行管理,这里的option可以设置的有allowModifications属性(配置文件中的属性是否可以修改),nestSeparator属性(配置文件中的key分隔符,默认为点)。

下面是调用了$iniArray = $this->_loadIniFile($filename);这个函数非常重要,就是解析了配置文件。跟进去,先是调用了_parseIniFile,为了不让大家凌乱,我们看下_parseIniFile返回出来的数据是什么样子的:

Array 
( 
    [general] => Array 
        ( 
            [url.base] => /usvn 
            [translation.locale] => zh_CN 
            [timezone] => Asia/Shanghai 
            [system.locale] => aa_DJ.utf8 
        ) )

最后解析出来的东西是一个二维数组。

parseIniFile实际上是调用了系统函数parse_ini_file来进行处理的。这里特别注意一下,在调用parse_ini_file前后它其实使用了set_error_handler和restore_error_handler,将异常处理的函数暴露出来。因为在解析配置文件的时候其实非常容易出现错误,而且这个错误的用户提示应该要非常友好,最好能提示用户在那里进行修改,所以Zend特意将错误处理函数暴露出来。如果你想设计一款很友好的系统的话,请在继承类中重写方法_loadFileErrorHandler。

继续从_loadIniFile看下去

由于我们的ini配置文件中使用[]表示了一个setion,因此_loadIniFile返回的二维数组返回的key就是general。但是其实如果我们在配置文件中使用[general:123]作为section,那么这个函数就会将123作为[;extends]的val返回。实际是这样的

Array 
( 
    [general] => Array 
        ( 
            [;extends] => 123 
            [url.base] => /usvn 
            [translation.locale] => zh_CN 
        ) )

现在又回到了__construct,这时候iniArray已经获取到了,是个二维数组,下面如果你设置了获取section的话,就会将iniArray进行处理_arrayMergeRecursive,主要就是将key中的system.locale => aa_DJ.utf8变为array(system=> array( locale=>aa_DJ.utf8))。 这里就是用到了options中的nestSeparator属性,这个属性默认是点,就是translation.locale会被分隔成数组,比如你在前面传入的nestSeparator为冒号,那么你的配置文件就应该设置为translation:location = .. 这里就不继续追下去了,里面无非就是一些字符串操作。

最后分析回来的dataArray是这个样子的

Array 
( 
    [url] => Array 
        ( 
            [base] => /usvn 
        )     [translation] => Array 
        ( 
            [locale] => zh_CN 
        ) 
    [timezone] => Asia/Shanghai 
    [system] => Array 
        ( 
            [locale] => aa_DJ.utf8 
        ) 
)

下面调用父类的构造函数__construct, Zend_Config_Ini的父类是Zend_Config。

class Zend_Config implements Countable, Iterator

Zend_Config实现了Countable接口(包含count()方法),Iterator接口(包含current,key,next,rewind,valid等方法)

Zend_Config的构造函数将上面分析的二维数组放到_data中了。

这里注重看两个函数

__set和__get

魔术方法__get保证了可以使用config->field获取配置值

魔术方法__set保证了是否可以修改配置文件,set中就使用到了_allowModifications,如果这个属性有设置,那么__setter就可以设置,否则会抛出Zend_Config is read only的异常,allowModifications也是options中设置的属性之一。

至此,看文章最前面的demo代码

date_default_timezone_set($config->timezone);

这里之所以能使用->timezone就是使用了__get而不是config中的属性。
Zend的Config机制分析结束。

PHP 相关文章推荐
PHP用户指南-cookies部分
Oct 09 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
May 09 PHP
PHP中的替代语法简介
Aug 22 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
thinkPHP下的widget扩展用法实例分析
Dec 26 PHP
Yii使用migrate命令执行sql语句的方法
Mar 15 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
Jun 17 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
Oct 16 PHP
Laravel 5.5 异常处理 & 错误日志的解决
Oct 17 PHP
PHP常用函数之根据生日计算年龄功能示例
Oct 21 PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 PHP
Zend的Registry机制的使用说明
May 02 #PHP
Zend的MVC机制使用分析(二)
May 02 #PHP
Zend的MVC机制使用分析(一)
May 02 #PHP
基于Zend的Captcha机制的应用
May 02 #PHP
PHP静态调用非静态方法的应用分析
May 02 #PHP
Mysql中分页查询的两个解决方法比较
May 02 #PHP
记录mysql性能查询过程的使用方法
May 02 #PHP
You might like
使用PHP函数scandir排除特定目录
2014/06/12 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
js实现文字无缝向上滚动
2017/02/16 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
用Python写的图片蜘蛛人代码
2012/08/27 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
Python实现的建造者模式示例
2018/08/06 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
英国探险旅游专家:Explore
2018/12/20 全球购物
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
Linux文件系统类型
2012/09/16 面试题
毕业生找工作推荐信
2013/11/21 职场文书
付款委托书范本
2014/10/05 职场文书
县政协领导班子群众路线教育实践活动四风问题整改方案
2014/10/26 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
asyncio异步编程之Task对象详解
2022/03/13 Python