首页 > 编程语言 >浅谈PHP设计模式的单例模式

浅谈PHP设计模式的单例模式

时间:2022-10-27 15:11:40浏览次数:45  
标签:function __ PHP obj 浅谈 self private static 设计模式

简介:

单例模式是创建型对象的一种,用于如何优雅的创建对象。
让一个类最多产生一个对象。

场景:

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

优点:

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

缺点:

对象生命周期都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎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();

标签:function,__,PHP,obj,浅谈,self,private,static,设计模式
From: https://www.cnblogs.com/phpphp/p/16832310.html

相关文章

  • 五种IO模型及设计模式
    下面就分别来介绍一下这5种IO模型的异同。1.阻塞IO模型最传统的一种IO模型,即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后,内核会去查看数据是否就绪,如......
  • 浅谈OpenHarmony LiteOS-A内核之基础硬件——中断控制器GIC400
     一、前言OpenAtomOpenHarmony(以下简称“OpenHarmony”)采用多内核架构,支持Linux内核的标准系统、LiteOS-A的小型系统、LiteOS-M的轻量系统。其中LiteOS-A要求设备具......
  • 设计模式-桥接模式
    将抽象部分与它的实现部分分离,使它们都可以独立地变化。将一个大抽象接口,分成多个小抽象接口,选择一个主抽象接口,持有其他接口地引用,继承变组合,组合地各个部分可以独立变化(......
  • [代码审计][ThinkPHP]Thinkphp3.2.3反序列化利用链分析
    文章目录​​Thinkphp3.2.3反序列化利用链分析​​​​分析​​​​利用链​​菜鸡在做CTF的时候想深入分析一下,也就产生了这篇文章Thinkphp3.2.3反序列化利用链分析分析首......
  • 浅谈安科瑞电力监控在生物制药企业变配电系统自动化改造的应用
    陈盼安科瑞电气股份有限公司上海嘉定201801摘要:本文分析生物制药企业的能耗特点,提出一种适合生物制药企业的管理构架方案,以提高变配电系统自动化管理水平,减少系统从故障中......
  • 浅谈OpenHarmony LiteOS-A内核之基础硬件——中断控制器GIC400
    一、前言​OpenAtomOpenHarmony(以下简称“OpenHarmony”)采用多内核架构,支持Linux内核的标准系统、LiteOS-A的小型系统、LiteOS-M的轻量系统。其中LiteOS-A要求设备具备一定......
  • 设计模式之桥接模式
    概述桥接模式是一种很实用的结构型设计模式。如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合单一职责......
  • 009-PHP循环输出数组成员
    北京";//等同于$Cities[0]="北京"天津";//等同于$Cities[1]="天津"上海";//等同于$Cities[2]="上海"深圳";//等同于$Cities[3]="深圳"$indexLimit=count($Cities);......
  • PHP json_decode如何输出数组(php json_decode how to output array)
    Hereismyphpcodewithjsonformattedstring:$string=';?>Iwanttolearnhowtoparse/outputjsonstringintosomethingIcanshowinhtmlorput......
  • PHP 2D数组输出所有组合
    我需要做同样的事情,并且尝试了此处发布的以前的解决方案,但无法使它们起作用。我从这个聪明的人http://www.php.net/manual/en/ref.array.php#54979中获得了一个样本。但......