首先我们要明确单例模式这个概念,那么什么是单例模式呢?
单例模式顾名思义,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称之为单例模式的要点有三个:
它们必须拥有一个构造函数,并且必须被标记为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 '不相等!';}结果: