一文带你搞懂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


猜你喜欢
- 对于比较长的数字组成的字符串,我们一般会用逗号(,)隔开来格式化数字,从右往左每三个数字用一个逗号分组隔开。为什么要用逗号隔开数字呢?因为当
- 你是否曾为表单设计感到过沮丧或不知所措呢?接下来三篇文章,希望能彻底改变你的看法,真正爱上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里数据过万后,明显可以感觉