首页 > 开发 > PHP > 正文

自制PHP框架之设计模式

2024-05-04 22:47:40
字体:
来源:转载
供稿:网友

为什么要使用设计模式?

设计模式,我的理解是为了达到“可复用”这个目标,而设计的一套相互协作的类。

感兴趣的读者可以阅读《Design Patterns: Elements of Reusable Object-Oriented Software》,四位作者(Gang of Four)在书中列举了业界闻名的23种设计模式。

这里先介绍我们框架要涉及的三种设计模式。

单例模式(singleton)

单例模式可以保证一个类只有一个对象实例, 常用在数据库存取类,从而节省硬件资源的消耗。

这里,我们改写上一章节的MySQL类

class MySQL extends DB{	private static $instance=null;	public static function getInstance(){		if(self::$instance==null){			self::$instance=new MySQL();		}		return self::$instance;	}	public function MySQL(){				/*Config*/		$this->IP='*';		$this->ServerID='*';		$this->ServerPassword='*';		$this->DataBaseName='*';		/*End of Config*/				$this->connection=mysqli_connect($this->IP,$this->ServerID,$this->ServerPassword,$this->DataBaseName);				if(!$this->connection){			die('Could not connect'.$this->connection);		}				mysqli_query($this->connection,'set names utf8');	}	public function Execute($sql){		return mysqli_query($this->connection,$sql);		}	public function Query($sql){		$result=mysqli_query($this->connection,$sql);		$arr=array();		while($row=mysqli_fetch_array($result)){			$arr[]=$row;		}		return $arr;	}	public function Close(){		mysqli_close($this->connection);	}}

这里要注意的是,如果实例化一个MySQL类,我们不再写

$db=new MySQL();

而是这样:

$db=MySQL::getInstance();

因为只有getInstance这个静态函数,才能保证只调用一次MySQL类的构造函数。

单例模式是很常用的设计模式,这里不再赘述。

外观模式(Facade)

因为命名空间的问题,外观模式可以保证一个类的诸多方法看似是“一个类提供的”,这里我们先设计一个简单的服务提供者类

class ServiceProvider{	public function Write($arg){		echo $arg;	}}

这个类只有一个Write方法,就是把参数打印出来

然后定义一个Facade类

class Facade{	public static function getInstance($classname,$args){		return new $classname($args);	}		public static function getFacadeAccessor(){		//	}		public static function __callstatic($method,$args){		$instance=static::getInstance(static::getFacadeAccessor(),$args);		return call_user_func_array(array($instance,$method),$args);	}}

要理解这个类,我们只要关注最后一个函数,就是__callstatic魔术方法。这个方法就是Facade类型对象或者其子类在调用他自身没有定义过的函数时,就会调用__callstatic方法,而这个方法最后调用了call_user_func_array函数,就是把任务交给提供这项服务的类去完成,同时完成参数的传递。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表