基于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+DBM的同学录程序(3)
Oct 09 PHP
杏林同学录(一)
Oct 09 PHP
Smarty+QUICKFORM小小演示
Feb 25 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
May 03 PHP
php 各种应用乱码问题的解决方法
May 09 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
Nov 08 PHP
laravel 5 实现模板主题功能(续)
Mar 02 PHP
PHP使用PDO连接ACCESS数据库
Mar 05 PHP
PHP永久登录、记住我功能实现方法和安全做法
Apr 27 PHP
PHP生成可点击刷新的验证码简单示例
May 13 PHP
PHP实现的数据对象映射模式详解
Mar 20 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的FTP学习(四)
2006/10/09 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
ThinkPHP3.1.3版本新特性概述
2014/06/19 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
查找iframe里元素的方法可传参
2013/09/11 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
浅谈JS继承_借用构造函数 & 组合式继承
2016/08/16 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
2019/07/10 jQuery
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
Python数据结构之Array用法实例
2014/10/09 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
python3编码问题汇总
2016/09/06 Python
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
利用Python开发实现简单的记事本
2016/11/15 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
python re模块findall()函数实例解析
2018/01/19 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
美国知名艺术画网站:Art.com
2017/02/09 全球购物
资产评估专业学生的自我鉴定
2013/11/14 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技
MSSQL基本语法操作
2022/04/11 SQL Server
python中urllib包的网络请求教程
2022/04/19 Python