简单了解什么是PHP单例模式?

    选择打赏方式

1.什么是单例模式?我们为什么要用单例模式?

    单例模式最常用在需要只使用这一个类,而不是会有多个类(数据库操作);作为对象的创建模式,单例模式确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口,它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

    打个比方。比如现在有个config类,这个类主要是存储这个项目的配置信息。如果说这个类能实例化多次的话,那么如果在代码运行中对配置进行了修改,那么你如何知道是在哪个配置类中进行了修改了呢?如果这个时候使用单例模式的话,就避免了情况的发生,所有对于配置文件的改变都是基于这个类的实例进行修改的,从而不会出现因为多个类的实例化,对于操作的改变没有进行实时的更新。而且,实例多个类库,占用内存也会非常的厉害,这样只实例化一次。是不是好处多多呢?

2.PHP单例模式三要素

需要一个保存类的唯一实例的静态成员变量。
构造函数和克隆函数必须声明为私有的,防止外部程序创建或复制实例副本。
必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用。

3.用六部分剖析单例模式:

<?php
/*
单例设计模式 (单态)
    定义: 一个类 只能允许有 一个对象存在.
    1.不让进: 使类不能被实例化
    2.禁克隆: 使类不能被克隆
    3.留后门: 设置静态方法
    4.给对象: 在静态方法里实例化该类
    5.判初夜: 判断是否是 第一次产生该类的对象
    6.设静态: 静态方法里 要使用静态属性
 */

/*//1.不让进: 使类不能被实例化-----------------
class Test
{
    // 构造器私有化:禁止从类外部实例化
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
}*/

/*//2.禁克隆: 使类不能被克隆--------------------
class Test
{
    // 构造器私有化:禁止从类外部实例化
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    // 克隆方法私有化:禁止从外部克隆对象
    private function __clone()
    {
        //占位, 谁也别想COPY我~~~
    }
}*/

/*//3.留后门: 设置静态方法--------------------
class Test
{
    // 构造器私有化:禁止从类外部实例化
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    // 克隆方法私有化:禁止从外部克隆对象
    private function __clone()
    {
        //占位, 谁也别想COPY我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br>";
    }
}*/

/*//4.给对象: 在静态方法里实例化该类------------------
class Test
{
    // 构造器私有化:禁止从类外部实例化
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    // 克隆方法私有化:禁止从外部克隆对象
    private function __clone()
    {
        //占位, 谁也别想COPY我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br>";
        return new self();//实例化一个对象给你
    }
}*/

/*//5.判初夜: 判断是否是 第一次产生该类的对象------------------
class Test
{
    private static $obj = null;//属性值为对象,默认为null

    // 构造器私有化:禁止从类外部实例化
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    // 克隆方法私有化:禁止从外部克隆对象
    private function __clone()
    {
        //占位, 谁也别想COPY我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br>";
        if ($this->obj === null) {
            $this->obj = new self();//实例化一个对象
        }
        //返回的属性 其实就是本对象
        return $this->obj;
    }
}*/

//6.设静态: 静态方法里 要使用静态属性------------------
class Test
{
    private static $obj = null;//属性值为对象,默认为null

    // 构造器私有化:禁止从类外部实例化
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    // 克隆方法私有化:禁止从外部克隆对象
    private function __clone()
    {
        //占位, 谁也别想COPY我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br>";
        if (isset(self::$obj)) {
            self::$obj = new self();//实例化一个对象
        }
        //返回的属性 其实就是本对象
        return self::$obj;
    }
}

// 使用静态方法访问该类里的方法
$t1 = Test::getObject();
$t2 = Test::getObject();
$t3 = Test::getObject();
$t4 = Test::getObject();

//判断 两个对象 是否是同一个对象
if ($t1 === $t3) {
    exit('是本尊没错了!');
} else {
    exit('不是本人...');
}
PS:本文案例基于知乎大佬 @独身待苍颜 优化改进
版权声明:若无特殊注明,本文为《小傲世》原创,转载请保留文章出处。
本文链接:https://pjax.vip/184.html
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

呵呵 哈哈 吐舌 开心 笑眼 可怜 乖 啊 你懂得 不高兴 生气 汗 黑线 哭 真棒 阴险 鄙视 酷 滑稽 纳尼 疑问 委屈 惊讶 勉强

评论信息框
可使用QQ号实时获取昵称+头像

私密评论

吃奶的力气提交吐槽中...


既然没有吐槽,那就赶紧抢沙发吧!