PHP单例模式浅析
首先我们要明确单例模式这个概念,那么什么是单例模式呢?
单例模式顾名思义,就是只有一个实例。
作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,
这个类我们称之为
单例模式的要点有三个:
它们必须拥有一个构造函数,并且必须被标记为private
它们拥有一个保存类的实例的静态成员变量
它们拥有一个访问这个实例的公共的静态方法单例类。
和普通类不同的是,单例类不能在其他类中直接实例化。单例类只能被其自身实例化。要获得这样的一种结果, __construct()方法必须被标记为private。如果试图用private构造函数构造一个类,就会得到一个可访问性级别的错误。
要让单例类起作用,就必须使其为其他类提供一个实例,用它调用各种方法。单例类不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。结果是单例类不会重复占用内存和系统资源,从而让应用程序的其它部分更好地使用这些资源。作为这一模式的一部分,必须创建一个空的私有__clone()方法,以防止对象被复制或克隆。
返回实例引用的这个方法通常被命名为getInstance()。这个方法必须是静态的,而且如果它还没有实例化,就必须进行实例化。getInstance() 方法通过使用 instanceof 操作符和self 关键字,可以检测到类是否已经被实例化。
header("Content-type:text/html;charset=utf-8");
//单例测试类
class Test {
private $unique;
static private $instance;//静态属性保存该类实例
private function __construct(){//构造方法私有(防止外界调用)
$this->unique=rand(0,20000);
}
static public function getInstance(){//静态方法提供对外接口(获取实例)
if(!self::$instance instanceof self){
self::$instance=new self();
}
return self::$instance;
}
private function __clone(){}//私有克隆方法,防止外界直接克隆该实例
}
$test=Test::getInstance();
$test2=Test::getInstance();
print_r($test);
print_r($test2);
if($test===$test2){
echo '相等!';
}else{
echo '不相等!';
}
结果: