Singleton Pattern of PHP Design Pattern (Singleton Pattern)

Application scenarios

Database connector
Log recorder
Application lock file (theoretically there is only one lock file for the entire application...)

structure

Four private and one public
Privatization construction method: prevent the use of new to create multiple instances;
privatization cloning method: prevent clone multiple instances;
privatization reconstruction method: prevent deserialization
privatization static properties: prevent direct access to storage instance properties

Demo
<?php
/**
 * 普通类
 * Class Db1
 */
class Db1
{
    
    
    public static $instance = null;

    public static function getInstance()
    {
    
    
        if (null === static::$instance) {
    
    
            static::$instance = new static();//实例化自身
        }

        return static::$instance;
    }

    public function __construct()
    {
    
    
    }

    public function __clone()
    {
    
    
    }

    public function __wakeup()
    {
    
    
    }

}
$db1 = new Db1();
$db2 = new Db1();
$db3 = clone $db2;
$db4 = Db1::getInstance();
$db5 = unserialize(serialize($db4));


var_dump($db1);
echo '<hr>';
var_dump($db2);
echo '<hr>';
var_dump($db3);
echo '<hr>';
var_dump($db4);
echo '<hr>';
var_dump($db5);
echo '<hr>';
//打印结果
object(Db1)#1 (0) { }
object(Db1)#2 (0) { }
object(Db1)#3 (0) { }
object(Db1)#4 (0) { }
object(Db1)#5 (0) { }

Insert picture description here

/**
 * 单例
 * Class Db2
 */
class Db2
{
    
    
    private static $instance = null;

    public static function getInstance()
    {
    
    
        if (null === static::$instance) {
    
    
            static::$instance = new static();
        }

        return static::$instance;
    }

    /**
     * 防止使用 new 创建多个实例
     *
     * Db2 constructor.
     */
    private function __construct()
    {
    
    
    }

    /**
     * 防止 clone 多个实例
     */
    private function __clone()
    {
    
    
    }

    /**
     * 防止反序列化
     */
    private function __wakeup()
    {
    
    
    }
}

$db6 = Db2::getInstance();
$db7 = Db2::getInstance();

var_dump($db6);
echo '<hr>';
var_dump($db7);
echo '<hr>';
//输出结果 实例化后对象被存储 程序自始至终只做一次实例化
object(Db2)#6 (0) { }
object(Db2)#6 (0) { }

Guess you like

Origin blog.csdn.net/qq_41526316/article/details/108495826