职责和单例模式
单例模式也认为是指责模式。
单例类至少拥有以下三种公共元素:
1、必须拥有一个构造函数,并且必须被标记为private
2、拥有一个保存类的实例的静态成员变量
3、拥有一个访问这个实例的公共的静态方法
单例类只能被自身实例化,所以__construct()方法必须标记为private.
1、数据库连接职责的集中控制
1 class Database{ 2 private $_db; //构造对象时这个变量会被填充 3 static $_instrance; //保存类仅有的一个实例 4 5 private function __construct(){ //只能被自身实例化,必须这样定义 6 $this->_db=mysql_connect('localhost','root','mysql'); 7 mysql_select_db('zzm',$this->_db); 8 } 9 private function __clone(){} //防止对象被复制或者克隆 10 11 /** 12 此静态方法是单例模式的实际构造。此函数会检查静态实例变量是否已保存这个类的一个实例。 13 如果它没有包含自身的一个实例,类会被初始化并且保存到$_instance变量中。 14 下一次调用这段代码时,$_instance 变量会保存类的一个实例,并且这个类 15 不会在实例化。最后,这个方法会返回实例的应用。 16 **/ 17 public static function getInserance(){ 18 if(!(self::$_instrance instanceof self)){ 19 self::$_instrance=new self(); 20 } 21 return self::$_instrance; 22 } 23 //使用$this->_db执行一个查询 24 public function query($sql){ 25 return mysql_query($sql,$this->_db); 26 } 27 }
<?php // 使用单例类 $db=Database::getInserance(); $db->query('select * from users'); //说明:通过调用getinstance()方法,$db现在存有内部存储实例的应用。通过此实例可调用单例类中定义 的任何非静态方法 // 如果某个类不需要使用__construct方法,那么这个类就不太适合使用单例模式。 这样应使用纯静态类, 只需提供一个没有函数体的私有构造函数,并且去掉getInstance()和$_instance成员就可以做到这一点。 这会防止类被实例化,它通过消除使用这段代码时获得实例的可能性确保了单一职责性。 如下为纯静态类 class SomeClass{ //防止类被当作实例使用 private function __construct(){} public static function SomeMethod(){ //执行一些操作 } } ?>