基于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机制分析结束。
上一篇: 等你三十了我就送你一辆车
下一篇: 这就是爱情