初学 PHP 单例模式

一. new 对象和 clone 对象

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

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

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

file
上图中红色框框起来的数字代表了 $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);

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

三. instanceof 关键字

该关键字可以用于判断某对象是否来自于某类,如果是返回true,否则返回false

<?php
class Foo
{
}

$foo = new Foo;
var_dump($foo instanceof Foo); //输出 true
var_dump($foo instanceof stdClass); //输出 false
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2
阿神

讲的简单易懂:thumbsup:

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!