单例模式是我们经常会使用的设计模式,常用来针对重复创建对象的情况下,由于在整个运行环境中仅仅存在一份,有时候我们也把他用来像常量一样来保存数据。这里说一句,我们在使用JSON对象来保存数据这就相当于变量来保存数据,我们使用单例来保存数据就会类似于结构化的常量。
单例模式我们仅仅只需要创建一个类,我尽量在类中间做好注释。
<?php
class Sigon{
//用来保存自己这个对象
private static $obj = NULL;
/*
* 设置构造方法为私有,不允许外部创建对象,实际上我们在其他方法中创建对象,
* 就是对该方法的调用,我们在这个方法 内部可以做一些初始化的工作
* */
private function __construct(){
}
//提供外部创建对象的接口,因为已经在外部没办法创建对象了,所以一定是静态的
public static function create(){
//判断自身对象是否已经存在,不存在才创建
if(self::$obj === NULL){
self::$obj = new self();
}
//将对象返回使用
return self::$obj;
}
}
$sigonobj = Sigon::create();
var_dump($sigonobj);
执行研究这个类,就知道这个类并不复杂。现在我们面临两个关键问题1.这个类可以通过继承创建其子类对象,我们就失去了仅仅创建一个对象的初衷。2.我们还知道使用clone也能创建出一模一样的对象。面对这两个问题。我们也当然有办法解决。
//提供外部创建对象的接口,因为已经在外部没办法创建对象了,所以一定是静态的
final public static function create(){
//判断自身对象是否已经存在,不存在才创建
if(self::$obj === NULL){
self::$obj = new self();
}
//将对象返回使用
return self::$obj;
}
private function __clone(){}
这样几行代码就轻易解决了这个问题。