首页 > PHP开发 > php编程设计模式之单例模式

php编程设计模式之单例模式

作者: 分类:PHP开发 点击: 8,928 次

    应用场景:

    数据库连接这种比较耗费资源的操作;
    我们希望整个应用只实例化一个;

    结构:4私1公;

    私有化构造方法: 防止使用 new 创建多个实例;
    私有化克隆方法: 防止 clone 多个实例;
    私有化重建方法: 防止反序列化
    私有化静态属性: 防止直接访问存储实例的属性

    示例

    <?php
    namespace Baijunyao\DesignPatterns\Singleton;

    /*** 普通类
    * Class Db1
    * @package Baijunyao\DesignPatterns\Singleton
    */
    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>';

    /** 单例
    * Class Db2
    * @package Baijunyao\DesignPatterns\Singleton
    */
    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>';

    github:https://github.com/baijunyao/design-patterns/tree/master/singleton

    php编程设计模式之单例模式

    运行代码我们可以看到;
    普通类DB1的句柄每个都是不一样的;
    一共5个实例;
    而单例这两个的句柄都是 27 ;
    一直是一个实例;(转自:白俊遥博客)



文章作者:honor
本文地址:https://wanlimm.com/77201808236664.html
版权所有 © 转载时必须以链接形式注明作者和原始出处!

上一篇:
下一篇:

或许你会感兴趣的文章:

2条回应:“php编程设计模式之单例模式”

  1. avatar knight说道:

    下载视频,没有几分,发几条消息!

  2. avatar test0007说道:

    下载视频,没有几分,发几条消息!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.