PHP 单例模式

一. new 对象和 clone 对象

学习单例模式之前,需要先搞清楚这两个关键字的用法,先看一个例子.

<?php
class Foo{
    public $bar = 'A string';
}

$foo1 = new Foo;
$foo2 = new Foo;
$foo3 = clone $foo1;
var_dump($obj1, $obj2, $obj3);

在这里插入图片描述

上图中红色框框起来的数字代表了 $foo1 $foo2 $foo3 这三个对象分别引用了不同的地址,也就是无论是用 new 关键字,还是 clone 关键字所产生的对象都不是同一个.
问题在于,如果每一次使用该类的实例,都去产生一个新对象,就会浪费资源,单例模式就很好的解决了这个问题,在单例模式中,首先需要禁用 __construct( ) 方法,也就意味着不能从类的外部去 new 该类了,其次需要禁用 __clone( ) 方法,也就意味不能通过克隆该类的实例获得新对象.

二. 单例模式

<?php
class Foo
{
    public $bar = 'A string';
    //1.创建一个静态私有属性,用于保存当前类的实例
    private static $instance = null;

    //2.构造方法私有化,从而禁止从外部用new关键字创建实例
    private function __construct()
    {

    }

    //3.克隆方法私有化,从而禁止从外部通过clone关键字创建实例
    private function __clone()
    {

    }

    //4.定义公共静态方法,用于生成当前类的实例
    public static function getInstance()
    {
        //如果$instance变量中保存的不是当前类的实例
        if (!self::$instance instanceof self) {
            //那么就new一个当前类,并保存在$instance中
            self::$instance = new self();
        }
        //否则直接返回$instance
        return self::$instance;
    }
}

$foo1 = Foo::getInstance();
$foo2 = Foo::getInstance();
$foo3 = Foo::getInstance();
var_dump($foo1, $foo2, $foo3);

在这里插入图片描述

注意上图中圈起来的数字,三个对象都指向同一个地址.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值