基于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 代码规范小结
Mar 08 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
Oct 22 PHP
简单的php中文转拼音的实现代码
Feb 11 PHP
php实现压缩多个CSS与JS文件的方法
Nov 11 PHP
PHP中SimpleXML函数用法分析
Nov 26 PHP
PHP代码实现表单数据验证类
Jul 28 PHP
PHP常用设计模式之委托设计模式
Feb 13 PHP
Linux php 中文乱码的快速解决方法
May 13 PHP
Netbeans 8.2将支持PHP7 更精彩
Jun 13 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
PHP面向对象类型约束用法分析
Jun 12 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
图象函数中的中文显示
2006/10/09 PHP
php面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
Jquery下的26个实用小技巧(jQuery tips, tricks & solutions)
2010/03/01 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
2015/07/15 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
Vue表单输入绑定的示例代码
2018/11/01 Javascript
jquery实现下载图片功能
2019/07/18 jQuery
Vue实现验证码功能
2019/12/03 Javascript
[48:39]Ti4主赛事胜者组第一天 EG vs NEWBEE 2
2014/07/19 DOTA
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
深入理解Python变量与常量
2016/06/02 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
Java基础类库面试题
2013/09/04 面试题
企划专员岗位职责
2013/12/09 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
文明家庭事迹材料
2014/12/20 职场文书
关于长城的导游词
2015/01/30 职场文书
东京审判观后感
2015/06/01 职场文书
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏