基于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 03 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
Feb 02 PHP
php实现根据url自动生成缩略图的方法
Sep 23 PHP
php实现读取手机客户端浏览器的类
Jan 09 PHP
PHP实现批量修改文件后缀名的方法
Jul 30 PHP
php构造函数与析构函数
Apr 23 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
PHP里的$_GET数组介绍
Mar 22 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
May 29 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 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
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
JS中prototype的用法实例分析
2015/03/19 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
详解Javascript 中的 class、构造函数、工厂函数
2017/12/20 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
python+pyqt实现12306图片验证效果
2017/10/25 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
pandas中的series数据类型详解
2019/07/06 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
django fernet fields字段加密实践详解
2019/08/12 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
python实现静态服务器
2019/09/05 Python
Django实现文件上传和下载功能
2019/10/06 Python
在notepad++中实现直接运行python代码
2019/12/18 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
Python urllib.request对象案例解析
2020/05/11 Python
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
保时捷设计:Porsche Design
2019/03/30 全球购物
顶岗实习计划书
2014/01/10 职场文书
表扬信格式
2014/01/12 职场文书
入学生会自荐书范文
2014/02/05 职场文书
行政专员求职信范文
2014/05/03 职场文书
个人承诺书格式
2014/06/03 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle
mysql查看表结构的三种方法总结
2022/07/07 MySQL