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=iniArray=this->_loadIniFile($filename);这个函数非常重要,就是解析了配置文件。跟进去,先是调用了_parseIniFile,为了不让大家凌乱,我们看下_parseIniFile返回出来的数据是什么样子的:

 


1

2

3

4

5

6

7

8

9

10

11

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返回。实际是这样的


1

2

3

4

5

6

7

8

9

10

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是这个样子的


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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

时间: 2024-11-05 20:20:28

Zend的Config机制的相关文章

基于Zend的Config机制的应用分析_php实例

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.i

Zend的Registry机制

项目过程中有很多全局变量, 需要全局存储,是否是使用全局变量来进行存储?那就弱爆了.Zend使用Registry机制(注册表)存储对象和值,是一个存储对象和值的容器. Zend_Registry这个类就是做这个目的 代码示例 Zend_Registry::set('config', $config);  Zend_Registry::get('config');   代码分析 这两个函数是最常用的两个函数.我们来看一下这个类 class Zend_Registry extends ArrayOb

Zend的Registry机制的使用说明_php实例

项目过程中有很多全局变量, 需要全局存储,是否是使用全局变量来进行存储?那就弱爆了.Zend使用Registry机制(注册表)存储对象和值,是一个存储对象和值的容器. Zend_Registry这个类就是做这个目的 代码示例Zend_Registry::set('config', $config); Zend_Registry::get('config'); 代码分析这两个函数是最常用的两个函数.我们来看一下这个类 class Zend_Registry extends ArrayObject

Zend的AutoLoad机制

在使用zend framework的时候,最先引入的一定是AutoLoad的机制,这里就想分析下Zend的AutoLoad是怎么引入的.   代码示例 1 2 3 4 5 6 7 8 9 10 11 12 13 set_include_path(USVN_LIB_DIR . PATH_SEPARATOR . get_include_path());   require_once 'Zend/Loader/Autoloader.php';   $autoloader = Zend_Loader_A

Zend的MVC机制(一)

代码   1 2 3 4 5 6 7 8 9 10 11 12 13 14 $front = Zend_Controller_Front::getInstance(); Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR));   $front->setRequest(new USVN_Controller_Request_Http()); $front->throwExceptions(true); $front-&

Zend的Captcha机制

如何生成验证码图片?使用php的GD? ok,right.其实Zend的Captcha模块已经封装好了.这篇文章就说一下如何使用Zend的Captcha模块.   环境安装 首先Zend的Captcha需要安装GD.查看有没有安装GD需要去phpinfo()中看是否有GD模块.(注意,有可能出现php -m里面的模块有gd但phpInfo()里面的模块没有gd,这个问题是说明你的PHP和Apache没有安装对.具体请去google之) (如果在安装gd的过程中提示Missing Dependen

Zend的MVC机制(二)

接着上面的一篇   把代码贴上来   1 2 3 4 5 6 7 8 9 10 11 12 13 14 $front = Zend_Controller_Front::getInstance(); Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR));   $front->setRequest(new Zend_Controller_Request_Http()); $front->throwExceptions(t

Zend的MVC机制使用分析(一)_php实例

代码 复制代码 代码如下: $front = Zend_Controller_Front::getInstance(); Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR)); $front->setRequest(new USVN_Controller_Request_Http()); $front->throwExceptions(true); $front->setBaseUrl($config->

Zend的MVC机制使用分析(二)_php实例

接着上面的一篇 把代码贴上来 复制代码 代码如下: $front = Zend_Controller_Front::getInstance(); Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR)); $front->setRequest(new Zend_Controller_Request_Http()); $front->throwExceptions(true); $front->setBaseUrl(