在很多时候,需要控制一个类,全局只要一个实例,以控制唯一访问点。
而我们今天的主角--单例模式
class Single {
private static $_instance = null; //静止获取
private $_num = null;
private function __construct() {} //禁止实例化
private function __clone() {} //禁止克隆
public static function getInstance() { //唯一获取实例的方法
if(self::$_instance == null || !self::$_instance instanceof self ) {
self::$_instance = new self();
self::$_instance->_num = rand(1,100);
}
return self::$_instance;
}
public function getNum(){
echo "the number is ".$this->_num;
}
}
//使用方式
$instance = Single::getInstance();
$instance->getNum();
$instance2 = Single::getInstance();
$instance2->getNum();
上面的instance 和 instance2 的实例是一样的,num的值是一致的
实现单例模式的关键在于:
只能有一个获取实例的接口 getInstance, 禁止通过new 获取实例,禁止克隆,同时保存实例的那个静态变量为私有。而这些都是为了防止调用者,通过除了getIntance去获取实例, 这是在控制访问的唯一入口。
单例模式的优点在于:
1.提供实例的全局唯一访问点,确保只有一个对象被创建。
2.对唯一实例的受控访问
3.缩小名空间 单例(Singleton)模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间