基于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 相关文章推荐
ADODB类使用
Nov 25 PHP
发布一个用PHP fsockopen写的HTTP下载的类
Feb 22 PHP
joomla内置的表单验证功能使用方法
Jun 11 PHP
php设计模式之观察者模式的应用详解
May 21 PHP
php三维数组去重(示例代码)
Nov 26 PHP
浅谈php扩展imagick
Jun 02 PHP
使用CodeIgniter的类库做图片上传
Jun 12 PHP
ThinkPHP添加更新标签的方法
Dec 05 PHP
php通过rmdir删除目录的简单用法
Mar 18 PHP
Symfony2学习笔记之插件格式分析
Mar 17 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
Jul 14 PHP
thinkphp分页实现效果
Oct 13 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静态类的原罪详解
2013/05/06 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
JavaScript的原型继承详解
2015/02/15 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
Three.js实现浏览器变动时进行自适应的方法
2017/09/26 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
JS实现小米轮播图
2020/09/21 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
在Python中关于中文编码问题的处理建议
2015/04/08 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
超市采购员岗位职责
2014/02/01 职场文书
幼儿园大班教学反思
2014/02/10 职场文书
办公室秘书岗位职责范本
2014/02/11 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
个人简历自我评价怎么写
2015/03/10 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript