基于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 文件上传代码(限制jpg文件)
Jan 05 PHP
php读取xml实例代码
Jan 28 PHP
初学PHP的朋友 经常问的一些问题。不断更新
Aug 11 PHP
php的大小写敏感问题整理
Dec 29 PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
Sep 27 PHP
php微信公众开发之获取周边酒店信息的方法
Dec 22 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
php使用PDO执行SQL语句的方法分析
Feb 16 PHP
PHP巧妙利用位运算实现网站权限管理的方法
Mar 12 PHP
php微信公众号开发之秒杀
Oct 20 PHP
php模式设计之观察者模式应用实例分析
Sep 25 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中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
PHP7新功能总结
2019/04/14 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
2016/01/01 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
js获取Get值的方法
2016/09/29 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
python实现html转ubb代码(html2ubb)
2014/07/03 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
Python从零开始创建区块链
2018/03/06 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
在python中实现强制关闭线程的示例
2019/01/22 Python
用Python解数独的方法示例
2019/10/24 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
Python3 利用face_recognition实现人脸识别的方法
2020/03/13 Python
Pytorch如何切换 cpu和gpu的使用详解
2021/03/01 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
出纳的岗位职责
2013/11/09 职场文书
软件工程师岗位职责
2013/11/16 职场文书
国际商务系学生个人的自我评价
2013/11/26 职场文书
《中华少年》教学反思
2014/02/15 职场文书
2014年新教师工作总结
2014/11/08 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
2016年最美孝心少年事迹材料
2016/02/26 职场文书
nginx中proxy_pass各种用法详解
2021/11/07 Servers