设计模式PHP版 - 单例模式

时间:2019-03-25
本文章向大家介绍设计模式PHP版 - 单例模式,主要包括设计模式PHP版 - 单例模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

单例可以用于产生唯一不重复的数字码,比如订单号。

<?php

final class Mysql // final 表示不允许被继承
{

    /**
     * @var self 用于保存实例
     */
    private static $instance;

    /**
     * @var int
     */
    public $int;

    /**
     * 实例化对象
     *
     * @return self
     */
    public static function getInstance()
    {
        if (!(self::$instance instanceof self)) { // 判断这个类是否已被实例化了(如果!($instance是对象且属于Mysql类))
            self::$instance = new self(); // 第一次调用时,$instance只是一个初始化变量,所以不会是对象。就进行实例化
        }
        return self::$instance; // 已经实例化过了就直接返回该实例
    }

    /**
     * 构造函数为私有,这样就不能new了
     */
    private function __construct()
    {}

    /**
     * 防止对象被复制
     */
    private function __clone()
    {
        trigger_error('Clone is not allowed !'); // 返回一个错误
    }
}


/**
 * 无论这里产生多少个,它们都是同一个实例,因为实例化过了就会return
 */
$mysql1 = Mysql::getInstance(); // 获取实例
$mysql2 = Mysql::getInstance(); // 获取实例
$mysql3 = Mysql::getInstance(); // 获取实例

/**
 * 在同一个实例的情况下,给int赋值,就会覆盖
 */
$mysql1->int = 1;
$mysql2->int = 2;
$mysql3->int = 3;

/**
 * 此时,还是同一个实例,上面最后覆盖的是3,那么这里就是打印了三次实例中的int变量
 */
print_r($mysql1->int);
print_r($mysql2->int);
print_r($mysql3->int);

如果以new的形式,最终打印结果就是123。
但是单例使用了静态修饰,当进入页面并使用了这个类时开始,直到页面执行完毕前,这个$instance都会一直存于内存。
所以当你Mysql::getInstance();获取实例的时候,其实获取的都是内存中同一个$instance