一文带你搞懂PHP单例模式

 更新时间:2022年12月20日 15:52:38   作者:程序员-南  
单例就是单实例的意思,即在系统全局,一个类只创建一个对象,并且在系统全局都可以访问这个对象而不用重新创建。本文将通过示例为大家详细讲解Java单例模式的使用,需要的可以参考一下

简介

单例模式是创建型对象的一种,用于如何优雅的创建对象。

让一个类最多产生一个对象。

场景

只需要一个对象就能解决并且要使用多次的场景,比如框架的数据库连接。

优点

减少资源消耗,一个对象能完成的事情,就不需要再实例化出来同样的东西。

缺点

对象生命周期都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式意义不大。

示例代码

class Demo {
    //声明一个存储对象的方法
    private static $obj;
    //防止当前类的外部进行实例化
    private function __construct() {}
    //防止当前类的外部进行克隆
    private function __clone() {}
    //声明一获取示例的方案
    public static function getInstance() {
        if(self::$obj === null) {
            self::$obj = new self();
        }
        return self::$obj;
    }
    public function otherFunction() {
        //todo ...
    }
}

测试代码:

class Demo {
    //声明一个存储对象的方法
    private static $obj;
    //防止当前类的外部进行实例化
    private function __construct() {}
    //防止当前类的外部进行克隆
    private function __clone() {}
    //声明一获取示例的方案
    public static function getInstance() {
        if(self::$obj === null) {
        //在此处打印数据到文件,可清楚的看出来执行了几次。
        //静态方法或者静态属性可以称之为类变量或者类属性,会随着类的加载一并加载到内存当中。
            file_put_contents('F:/stdout.txt', 1,FILE_APPEND);
            self::$obj = new self();
        }
        return self::$obj;
    }
    public function otherFunction() {
        //todo ...
    }
}
//类的外部执行了5次实例化操作
for($i = 0; $i < 5; $i++) {
    Demo::getInstance();
}

升级版本:

如果每一个类都写一个单例模式的话,会显得有重复的代码,为此可以用继承去解决这个问题。

此时self就需要修改为static,不然self是当前对象而不是子类对象。

static::方法或属性,这种使用称为后期静态绑定。

这和但是static 修饰成员属性或者成员方法,一个是使用,一个是修饰。

class Singleton {
    //声明一个存储对象的方法
    private static $obj;
    //防止当前类的外部进行实例化
    private function __construct() {}
    //防止当前类的外部进行克隆
    private function __clone() {}
    //声明一获取示例的方案
    public static function getInstance() {
    	//检测$obj是否为空并是否不属于当前类
        if(((static::$obj === null) && (! static::$obj instanceof static))) {
            static::$obj = new static();
        }
        return static::$obj;
    }
}
class Test extends Singleton {
    public function func() {
        return mt_rand(0, 10);
    }
}
//使用:
Test::getInstance()->func();

到此这篇关于一文带你搞懂PHP单例模式的文章就介绍到这了,更多相关PHP单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP获取远程图片并保存到本地的方法

    PHP获取远程图片并保存到本地的方法

    这篇文章主要介绍了PHP获取远程图片并保存到本地的方法,涉及php远程文件操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 详解PHP的执行原理和流程

    详解PHP的执行原理和流程

    这篇文章主要介绍了详解PHP的执行原理和流程,对此感兴趣的同学,可以详细看一下
    2021-04-04
  • 一个简单php扩展介绍与开发教程

    一个简单php扩展介绍与开发教程

    这个扩展早就写好了,只是一直没有时间写在blog上面,今天抽点时间,将它记录下来,以后备用。
    2010-08-08
  • PHP函数用法详解【初始化、嵌套、内置函数等】

    PHP函数用法详解【初始化、嵌套、内置函数等】

    这篇文章主要介绍了PHP函数用法,结合实例形式详细分析了PHP函数初始化、嵌套、内置函数等相关定义、原理与操作注意事项,需要的朋友可以参考下
    2020-06-06
  • PHP耦合设计模式实例分析

    PHP耦合设计模式实例分析

    这篇文章主要介绍了PHP耦合设计模式,结合实例形式分析了php面向对象程序设计中降低耦合度的相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • PHP Ajax跨域问题解决方案代码实例

    PHP Ajax跨域问题解决方案代码实例

    这篇文章主要介绍了PHP Ajax跨域问题解决方案代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • PHP实现简单的模板引擎功能示例

    PHP实现简单的模板引擎功能示例

    这篇文章主要介绍了PHP实现简单的模板引擎功能,结合实例形式详细分析了PHP实现模板引擎功能的模版类、编译类、控制器类及模板文件等实现方法与相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • php读取文件内容到数组的方法

    php读取文件内容到数组的方法

    这篇文章主要介绍了php读取文件内容到数组的方法,涉及php中file、rtrim等函数对文件及字符串的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • php重定向的三种方法分享

    php重定向的三种方法分享

    个人更倾向于header的方法,这样页面的跳转速度更快点,用户从视觉上不易察觉整页的跳转,而只是局部的变化
    2012-02-02
  • PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码

    PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码

    老声长谈,着是困惑很多人的问题,如果处理不好,都是乱码,说这些话并不是我对编码很精通,只是在这方面是得留神,自己总结了一点小经验
    2013-04-04

最新评论