zoukankan      html  css  js  c++  java
  • Zend的Config机制

    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机制分析结束。

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    NPOI操作Excel
    父窗口调用iframe子窗口方法
    js 全选全不选
    常用的几种 SQLServer 分页查询方式实现
    通用简单的 分页 SQL
    C#导出
    delphi xe firemonkey 调用VLC播放器播放视频
    Android版本和API Level对应关系
    Android开发之视频录制1
    Android上实现视频录制
  • 原文地址:https://www.cnblogs.com/yjf512/p/2619777.html
Copyright © 2011-2022 走看看