基于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中实现进程间通讯
Oct 09 PHP
PHP新手上路(十三)
Oct 09 PHP
关于mysql 字段的那个点为是定界符
Jan 15 PHP
PHP 变量类型的强制转换
Oct 23 PHP
PHP 循环列出目录内容的函数代码
May 26 PHP
php项目开发中用到的快速排序算法分析
Jun 25 PHP
PHP中串行化用法示例
Nov 16 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
Dec 14 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
Mar 24 PHP
创建无限极分类树型结构的简单方法
Jun 20 PHP
PHP实现的随机红包算法示例
Aug 14 PHP
PHP实现一个限制实例化次数的类示例
Sep 16 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
人族 Terran 魔法与科技
2020/03/14 星际争霸
定义php常量的详解
2013/06/09 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
PDO::errorInfo讲解
2019/01/28 PHP
ext监听事件方法[初级篇]
2008/04/27 Javascript
javascript dom 操作详解 js加强
2009/07/13 Javascript
动态调用CSS文件的JS代码
2010/07/29 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
详解jQuery事件
2017/01/13 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
JS实现商品橱窗特效
2020/01/09 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
python mysql断开重连的实现方法
2019/07/26 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
心理健康心得体会
2014/01/02 职场文书
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
大学生演讲稿
2014/04/25 职场文书
群众路线自我剖析及整改措施
2014/11/04 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server