基于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下实现农历日历的代码
Mar 07 PHP
显示程序执行时间php函数代码
Aug 29 PHP
php解压文件代码实现php在线解压
Feb 13 PHP
php+xml实现在线英文词典查询的方法
Jan 23 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
php操作(删除,提取,增加)zip文件方法详解
Mar 12 PHP
PHP实现的简单网络硬盘
Jul 29 PHP
PHP代码优化技巧小结
Sep 29 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
Sep 30 PHP
PHP实现找出链表中环的入口节点
Jan 16 PHP
YII框架常用技巧总结
Apr 27 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 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
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
用PHP实现读取和编写XML DOM代码
2010/04/07 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
js基于myFocus实现轮播图效果
2017/02/14 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
8个有意思的JavaScript面试题
2019/07/30 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
Django实现学员管理系统
2019/02/26 Python
python try 异常处理(史上最全)
2019/03/07 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
大专生简历的自我评价
2013/11/26 职场文书
产品销售计划书
2014/05/04 职场文书
三问三解心得体会
2014/09/05 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书