zeromemos
最好的学习方法就是输出所学的知识

PHP单例模式

转自知乎:独身待苍颜

作者:独身待苍颜
链接:https://www.zhihu.com/question/35285158/answer/141024074
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

/*//1.不让进: 使类不能被实例化-----------------
class Test
{
    // 设置 一个封装的构造方法
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
}*/

/*//2.留后门: 设置静态方法--------------------
class Test
{
    // 设置 一个封装的构造方法
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br/>";
    }
}*/

/*//3.给对象: 在静态方法里实例化该类------------------
class Test
{
    // 设置 一个封装的构造方法
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br/>";
        return new self();//实例化一个对象给你
    }
}*/

/*//4.判初夜: 判断是否是 第一次产生该类的对象------------------
class Test
{
    private $obj = null;//属性值为对象,默认为null
    // 设置 一个封装的构造方法
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br/>";
        if ($this->obj === null) {
            $this->obj = new self();//实例化一个对象
        }
        //返回的属性 其实就是本对象
        return $this->obj;
    }
}*/

//5.设静态: 静态方法里 要使用静态属性------------------
class Test
{
    private static $obj = null;//属性值为对象,默认为null
    // 设置 一个封装的构造方法
    private function __construct()
    {
        //占位, 我就是不让你NEW我~~~
    }
    //后门
    public static function getObject()
    {
        echo "啊,我是后门,进吧!<br/>";
        if (self::$obj === null) {
            self::$obj = new self();//实例化一个对象
        }
        //返回的属性 其实就是本对象
        return self::$obj;
    }
}

/*Test::getObject();//使用静态方法访问该类里的方法
exit;*/

$t1 = Test::getObject();
$t2 = Test::getObject();
$t3 = Test::getObject();
$t4 = Test::getObject();
$t5 = Test::getObject();
$t6 = Test::getObject();
$t7 = Test::getObject();
$t8 = Test::getObject();

//判断 两个对象 是否是同一个对象
if ($t1 === $t6) {
    echo "哦, Yes! 是同一个实例<br/>";
} else {
    echo "哦, No! 不是同一个实例<br/>";
}

讲的非常生动形象

评论区

关于我们

本站主要用于记录个人学习笔记,网站开发中,如需以前站内资料请加QQ群272473835索取。注册账号仅提供回帖功能,可不注册!

微信公众号