网络编程
位置:首页>> 网络编程>> php编程>> 一文带你搞懂PHP单例模式

一文带你搞懂PHP单例模式

作者:程序员-南  发布时间:2023-05-25 02:23:05 

标签:PHP,单例模式,设计模式

简介

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

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

场景

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

优点

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

缺点

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

来源:https://blog.csdn.net/qq_42342282/article/details/127692950

0
投稿

猜你喜欢

  • 对于比较长的数字组成的字符串,我们一般会用逗号(,)隔开来格式化数字,从右往左每三个数字用一个逗号分组隔开。为什么要用逗号隔开数字呢?因为当
  • 你是否曾为表单设计感到过沮丧或不知所措呢?接下来三篇文章,希望能彻底改变你的看法,真正爱上Web表单设计。首先感谢Luke Wroblews
  • 上一篇相关文章:段正淳的css笔记(2)圆角的做法 1、标题右侧“更多”的实现曾经做上图所示的效果,会使用到position来相对定位到h2
  • 本文汇总了在Access数据库安全问题中最为常见的问题来做出解答。问:什么是Microsoft Access 工作组,怎样创建工作组信息文件
  • 我有个MM在网上面安了家,想做一个关于特效的网站。她虽然懂一点网页制作,但是她的机器配置比较低,有时为了反复试验页面上一些特殊效果,而打开D
  • 1、很多B2C或者淘宝的卖家反应,下单了但没有支付的占有率超过30%,有的甚至到40%。对于冲动性消费的商品来说,这个70%左右的转化率其实
  • 当点了链接后,跳出的网页地址是https://www.aspxhome.com/ 或https://www.cidianwang.
  • 一般情况下,访问或设置剪贴板,IE 只需使用 window.clipboardData 的 getData 或 setData 方法即可。M
  • 很有创意的鼠标指针风筝,看起来非常有意思。在网络上看到的,一下也想不起来是那里的了,所以特别说一下图片是来自网络的,版权归作者所有。
  • 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1。如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就
  • 学习编写简练、优化的CSS需要大量的实践和一种不自觉的强迫性清洁的渴望。然而让你的CSS保持整洁并不仅仅是你对清洁的疯狂的心理需求,尤其对于
  • 如果你真正理解Javascript函数是如何调用工作的,那么就可以避免一些bug的发生; 首先让我们创建一个简单的函数,这个函数将在下文中使
  •  我希望大家看到该标题就能让想象到它的功能:      1、WITH TEMPL
  • 标志是一种简单的工具,就象铁锤,简单实用。如果一种工具功能太多导致其效用减弱,那就让它保持简单。你并不需要一把有太多装饰的精美铁锤。对于象征
  • 我们知道在超级链接的title属性中,是不支持html代码的,我们只能使用文本来处理提示信息。当然借助js可以做出很好的效果。这里讲一下如何
  • 一、备份数据库1、打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server2、SQL Server组-->
  • documentFragment 是一個無父對象的document對象.他支持以下DOM2方法:appendChild, cloneNode
  • 目前代码应该没什么bug了,兼容IE6.0 & FF 1.5, 通过xHTML 的Transitional验证和 CSS 验证。为了
  • Array()CInt()CStr() Date() DateAdd() Day() FormatCurrency() FormatDate
  • 由于众所周知的原因,ACCESS在大型站点应用中都靠不上边,主要问题就是数据量大了以后几乎无法索引。当ACCESS里数据过万后,明显可以感觉
手机版 网络编程 asp之家 www.aspxhome.com