不知道大家注意到没有,之前我们导入一个配置文件是通过include configs_path . '/config.php'来做的,这样做好吗?
不忙回答,我可以提两个问题:
1. 如果这个路径下面的config.php不存在会发生什么现象?
2.如果我将php这种配置文件修改成为xml这种配置文件之后会发生什么现象?
首先,如果文件不存在,那么php会抛出一个警告,但是程序继续执行;配置文件变成xml之后,入口文件处需要编写相应的读取xml的代码,而且需要把之前的include configs_path . '/config.php'这句代码修改掉。
那么有没有方法能够实现配置文件的无缝切换呢?
在具体讲解这些之前,我首先说一下工厂模式,现假设:a需要购买一辆红色汽车,他直接向b(一个生产汽车的工厂)提出需求,b按照a的需求,从仓库中选取一辆合适的汽车,然后交给a。整个过程,a只是提出需求,具体汽车的选取是由b工厂来确定的,这种方式就是工厂模式。
举个例子:
01 02 public class factory {
03 public static function factory($whichonetochoose) {
04 $returnval = 'red';
05 switch($whichonetochoose) {
06 case1 :
07 $returnval = 'blue';
08 break
09 case 2 :
10 $returnval = 'green';
11 break;
12 default :
13 break;
14 }
15 return $returnval;
16 }
17 }
工厂模式一般都有一个静态的方法:factory负责逻辑的处理。
现在我们可以新建一个专门处理配置文件的类:config.php
01 02 class config {
03 const xml = 1;
04 const ini = 2;
05 const php = 3;
06 public static function factory($which) {
07 switch($which) {
08 caseconfig::xml :
09 return xmlconfig::parse(configs_path . '/config.xml');
10 break;
11 case config::ini :
12 return iniconfig::parse(configs_path . '/config.ini');
13 break;
14 case config::php :
15 //此处没有做文件是否存在的判定,你可以自己判定一下,我只是做一个例子
16 return include configs_path . '/config.php';
17 break;
18 default:
19 return array();
20 break;
21 }
22 }
23 }
如果你要将配置文件修改成为xml这种方式,只需要在xmlconfig.php中实现即可,当然,为了简单,我在这儿只是实现ini配置文件的编写,xml的配置文件你可以自己去尝试一下,如果你想查看具体实现,可以查看toper中的/library/toper/config/xmlconfig.class.php的具体代码。
01 02 class xmlconfig {
03 public static function parse($file) {
04 if(!is_file($file)) {
05 throw new exception('none exists xml config file');
06 } else {
07 return parse_ini_file($file,true);
08 }
09 }
10 }
这个文件的代码是我随手写的,不保证代码的正确性,了解思路即可。