一个项目中肯定会频繁使用一些常用类,比如curl类,model类,如果每次都new,会造成不必要的内存开销。还有数据库连接这种比较费资源的操作我们希望整个应用只实列化一次。避免大量的new操作而消耗内存资源和系统资源。
一个单例类应包括以下几点:
和普通类不同,单例类不能被直接实例化,只能是由自身实例化。因此,要获得这样的限制效果,构造函数必须标记为private。
要让单例类不被直接实例化而能起到作用,就必须为其提供这样的一个实例。因此,就必须要让单例类拥有一个能保存类的实例的私有静态成员变量和对应的一个能访问到实例的公共静态方法。
在PHP中,为防止对单例类对象的克隆来打破单例类的上述实现形式,通常还为其提供一个空的私有__clone()方法。
对于一个类的对象,如果使用“clone运算符”,就会复制出一个和当前对象完全一样的新对象出来,并且,此时还会自动调用该类的魔术方法:__clone()(只要该类中有该方法)。
简单来说:单例模式是一种为了达到一个类只存在一个实例的目的所采用的一种写法
class Instance
{
#用来保存当前对象不允许外部直接使用
static private $instance;
#构造函数设置为私有拒绝外部直接new
private function __construct()
{ }
#克隆方法私有化:禁止从外部克隆对象
private function clone()
{ }
#入口方法,因为用静态属性返回类实例,
#而只能在静态方法使用静态属性,
#所以必须创建一个静态方法来生成当前类的唯一实例
public static function getInstance()
{
if (!self::$instance instanceof Instance) {
#检测当前类属性$instance是否已经保存了当前类的实例
#如果没有则实例化当前类并将对象赋值给$instance
self::$instance = new Instance();
}
return self::$instance; //返回$instance对象
}
#PHP中this,self,parent三个关键字从字面上比较好理解
#分别是指本实例、类本身、父亲。
}
$a = Instance::getInstance();
var_dump($a);
echo "<br>";
$b = Instance::getInstance();
var_dump($b);
echo "<br>";
$c = Instance::getInstance();
var_dump($c);
PHP单例模式三要素
1. 需要一个保存类的唯一实例的静态成员变量。
2. 构造函数和克隆函数必须声明为私有的,防止外部程序创建或复制实例副本。
3. 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用。
感谢博主,喝杯咖啡~