<?php
/**
* 单例模式(职责模式) 我想跟zend里提到的单件(Singleton)模式是一样的
* 三种公共的元素
* 1.它必须拥有一个构造函数,并且被标记为private
* 2.它们拥有一个保存类实例的静态成员变量
* 3.它拥有一个访问这个实例的静态方法
* (创建一个空的私有的__clone)
*
*/
class Datebase{
private $_db;
static $_instance;
private function __construct(){
$this->_db="aa";
}
private function __clone(){}
public static function getInstance()
{
if(!(self::$_instance instanceof self)){
self::$_instance=new self();
}
return self::$_instance;
}
public function query()
{
echo $this->_db;
}
}
$db=Datebase::getInstance();
$db->query();
?>
文档说明:
PHP中的单例模式(singleton pattern):指的是在PHP的应用程序的范围内只对指定的类创建一个实例。
在PHP中使用单例模式的类通常拥有一个私有构造函数和一个私有克隆函数,以防止用户通过创建对象或者
克隆对其进行实例化。还有一个静态私有成员变量$instance 与静态方法getInstance。getInstance 负责对其本身
实例化,然后将这个对象存储在$instance 静态成员变量中,以确保只有一个实例被创建。
例如:
<?php
//单例模式的类Lock
class Lock
{ //静态属性$instance
static private $instance = NULL;
//一个普通的成员属性
private $switch = 0;
//getInstance 静态成员方法
static function getInstance()
{ //如果对象实例还没有被创建,则创建一个新的实例
if(self::$instance == null)
{
self::$instance =new Lock();
} //返回对象实例
return self::$instance;
} //空构造函数
private function Lock()
{
}
//空克隆成员函数
private function __clone(){}
//设置$switch 的函数,如果$switch 为0则将其设置成1,否则将其设置成0
function setLock()
{ if($this->switch == 0)
$this->switch == 1;
else
$this->switch = 0;
} //获取$switch 的状态
function getLock()
{ //返回switch 属性
return $this->switch;
}
} //调用单例,设置$switch
Lock::getInstance()->setLock();
//判断开关状态
if(Lock::getInstance()->getLock() == 0)
echo “开关状态:关”;
else
echo “开关状态:开”;
?>
结果:
开关状态:关