基于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经典的给图片加水印程序
Dec 06 PHP
PHP 程序员也要学会使用“异常”
Jun 16 PHP
php设计模式 Bridge (桥接模式)
Jun 26 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 PHP
PHP exif扩展方法开启详解
Jul 28 PHP
php cookie中点号(句号)自动转为下划线问题
Oct 21 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 PHP
php中chdir()函数用法实例
Nov 13 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
Dec 15 PHP
ThinkPHP删除栏目(实现批量删除栏目)
Jun 21 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
php7 图形用户界面GUI 开发示例
Feb 22 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获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
jQuery $.each的用法说明
2010/03/22 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
python计算二维矩形IOU实例
2020/01/18 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
python实现定时发送邮件到指定邮箱
2020/12/23 Python
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
酒店管理自荐信
2013/10/23 职场文书
招商经理岗位职责
2013/11/16 职场文书
幼儿教师思想汇报
2014/01/10 职场文书
消防安全责任书
2014/04/14 职场文书
体育专业求职信
2014/07/16 职场文书
大学生实习证明范本
2014/09/19 职场文书
大学生毕业个人总结
2015/02/15 职场文书
同事欢送会致辞
2015/07/31 职场文书
企业安全生产规章制度
2015/08/06 职场文书
Python pandas读取CSV文件的注意事项(适合新手)
2021/06/20 Python
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs
SQL Server 中的事务介绍
2022/05/20 SQL Server
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android