怎么一步步编写简单的PHP的Framework(六)

原创
2012/11/20 23:26
阅读数 1.3K

      不好意思,由于最近事情比较多,昨天的确没有时间写,今天刚好还有接近一个小时的时间,所以就继续写一篇。

       不知道大家注意到没有,之前我们导入一个配置文件是通过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工厂来确定的,这种方式就是工厂模式。

       举个例子:

<?php
public class Factory {
	public static function factory($whichOneToChoose) {
		$returnVal = 'Red';
		switch($whichOneToChoose) {
			case 1 : 
				$returnVal = 'Blue';
				break
			case 2 :
				$returnVal = 'Green';
				break;
			default :
				break;
		}
		return $returnVal;
	}
}
       工厂模式一般都有一个静态的方法:factory负责逻辑的处理。


        现在我们可以新建一个专门处理配置文件的类:Config.php

<?php
class Config {
	const XML = 1;
	const INI = 2;
	const PHP = 3;
	public static function factory($which) {
		switch($which) {
			case Config::XML : 
				return XmlConfig::parse(CONFIGS_PATH . '/config.xml');
				break;
			case Config::INI :
				return IniConfig::parse(CONFIGS_PATH . '/config.ini');
				break;
			case Config::PHP :
				//此处没有做文件是否存在的判定,你可以自己判定一下,我只是做一个例子
				return include CONFIGS_PATH . '/config.php';
				break;
			default : 
				return array();
				break;
		}
	}
}


       如果你要将配置文件修改成为xml这种方式,只需要在XmlConfig.php中实现即可,当然,为了简单,我在这儿只是实现ini配置文件的编写,xml的配置文件你可以自己去尝试一下,如果你想查看具体实现,可以查看Toper中的/Library/Toper/Config/XmlConfig.class.php的具体代码。

        

<?php
class XmlConfig {
	public static function parse($file) {
		if(!is_file($file)) {
			throw new Exception('none exists xml config file');
		} else {
			return parse_ini_file($file,true);
		}
	}
}

        这个文件的代码是我随手写的,不保证代码的正确性,了解思路即可。

        今天的例子点此下载

展开阅读全文
打赏
1
11 收藏
分享
加载中
阳光test博主

引用来自“bunnys”的评论

引用来自“php码农”的评论

工厂模式一般用来取代的switch case的,详细见<<php设计模式>>,参数控制就行了。多用在DB适配器的选择,例如 db::factory('pdo_mysql'),没必要多一个工厂类。

db?不是工厂类?

我也没太懂他的意思,就我自己感觉这种应该是工厂吧
2012/12/19 12:26
回复
举报

引用来自“php码农”的评论

工厂模式一般用来取代的switch case的,详细见<<php设计模式>>,参数控制就行了。多用在DB适配器的选择,例如 db::factory('pdo_mysql'),没必要多一个工厂类。

db?不是工厂类?
2012/12/19 11:38
回复
举报
工厂模式一般用来取代的switch case的,详细见<<php设计模式>>,参数控制就行了。多用在DB适配器的选择,例如 db::factory('pdo_mysql'),没必要多一个工厂类。
2012/12/03 13:37
回复
举报
阳光test博主

引用来自“FoxHu”的评论

@明庭令 不错,学习了,博主的这个php编写框架系列让人受益很多,希望博主继续写下去!

谢谢啊,有时间我会一直写的,不过最近事情比较多,估计周末更新多一点
2012/11/21 22:29
回复
举报
一直在看呢....
2012/11/21 12:14
回复
举报
@明庭令 不错,学习了,博主的这个php编写框架系列让人受益很多,希望博主继续写下去!
2012/11/21 12:07
回复
举报
更多评论
打赏
6 评论
11 收藏
1
分享
返回顶部
顶部