基于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 CURL获取返回值的方法
May 04 PHP
PHP中exec与system用法区别分析
Sep 22 PHP
PHP MYSQL实现登陆和模糊查询两大功能
Feb 05 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
THINKPHP截取中文字符串函数实例代码
Mar 20 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP封装curl的调用接口及常用函数详解
May 31 PHP
php实现微信公众平台发红包功能
Jun 14 PHP
Yii2.0实现的批量更新及批量插入功能示例
Jan 29 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
Mar 18 PHP
php实现银联商务公众号+服务窗支付的示例代码
Oct 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
Zerg建筑一览
2020/03/14 星际争霸
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
php批量更改数据库表前缀实现方法
2013/10/26 PHP
php实现的操作excel类详解
2016/01/15 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
实现php删除链表中重复的结点
2018/09/27 PHP
JavaScript中九种常用排序算法
2014/09/02 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
使用D3.js+Vue实现一个简单的柱形图
2018/08/05 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
python文件特定行插入和替换实例详解
2017/07/12 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
解决tensorflow 释放图,删除变量问题
2020/06/23 Python
python如何随机生成高强度密码
2020/08/19 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
值传递还是引用传递
2015/02/08 面试题
干部考核评语
2014/04/29 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers