导航

简单的PHP单例模式

Posted on 2018-11-01 13:48  miosakura96  阅读(234)  评论(0)    收藏  举报
class MySQL
{

    private static $instance;

    // 阻止外部实例化
    private function __construct()
    {
        # code...
    }

    // 阻止外部clone
    private function __clone()
    {

    }

    // 创建对象,如果 $instance 不存在,对象就创建
    public static function getInstance()
    {
        if (!self::$instance instanceof self) {
            self::$instance = new self();
        }
        // var_dump(self::$instance);
        return self::$instance;
    }
}

$mysql = MySQL::getInstance();
$mysql2 = MySQL::getInstance();
$mysql->name = 'hello';
var_dump($mysql);
// echo "<hr />";
$mysql->name = 'world';
var_dump($mysql2);
var_dump($mysql);

 

从上面的代码,可以看出每次实例化对象都会去引用同一个对象的地址。

self::$instace instanceof self 确保了每次在实例化对象的时候会先去查看 $instance 这个静态变量是否有去实力化自身类并存入 $instance

这里要注意的是用到了静态变量!

通俗的理解一下,静态变量除非在手动unset的情况下被释放,否则在PHP脚本运行中始终存在。

这样的话,在第一次实例化的类的时候,将实例化的对象存入静态成员变量。

在第二次执行的时候,通过此变量的实例进行判断,来实现一个类,只能实例同一个对象的方法。

通过禁止克隆和禁止实例,因为实例在堆中开辟出新的对象,克隆也是一样(只是复制了上一对象的属性和方法,另外在堆中开辟了新的对象,和之前的对象是两个对象),并禁止了外部调用 静态成员变量,因为该变量只能用来存取 自身类的实例。

在通过公有方法 getInstance 实现了外部的调用。

这就是三私有一公的全部。

 

从上述代码也很容易看出,每个变量存取的都是相同的 一个实例对象的地址。那么单例有什么好处了?

是不是在内存中,只会有一个开销,减少了内存的开销。