简单的PHP单例模式
class MySQL
{ private static $instance; // 阻止外部实例化
private function __construct()
{
# code...
} // 阻止外部clone
private function __clone()
{ } // 创建对象,如果 $instance 不存在,对象就创建
public static function getInstance()
{
if (!self::$instance instanceof self) {
self::$instance = new self();
}
// var_dump(self::$instance);
return self::$instance;
}
} $mysql = MySQL::getInstance();
$mysql2 = MySQL::getInstance();
$mysql->name = 'hello';
var_dump($mysql);
// echo "<hr />";
$mysql->name = 'world';
var_dump($mysql2);
var_dump($mysql);
从上面的代码,可以看出每次实例化对象都会去引用同一个对象的地址。
self::$instace instanceof self 确保了每次在实例化对象的时候会先去查看 $instance 这个静态变量是否有去实力化自身类并存入 $instance
这里要注意的是用到了静态变量!
通俗的理解一下,静态变量除非在手动unset的情况下被释放,否则在PHP脚本运行中始终存在。
这样的话,在第一次实例化的类的时候,将实例化的对象存入静态成员变量。
在第二次执行的时候,通过此变量的实例进行判断,来实现一个类,只能实例同一个对象的方法。
通过禁止克隆和禁止实例,因为实例在堆中开辟出新的对象,克隆也是一样(只是复制了上一对象的属性和方法,另外在堆中开辟了新的对象,和之前的对象是两个对象),并禁止了外部调用 静态成员变量,因为该变量只能用来存取 自身类的实例。
在通过公有方法 getInstance 实现了外部的调用。
这就是三私有一公的全部。
从上述代码也很容易看出,每个变量存取的都是相同的 一个实例对象的地址。那么单例有什么好处了?
是不是在内存中,只会有一个开销,减少了内存的开销。
简单的PHP单例模式的更多相关文章
- 最简单的设计模式——单例模式的演进和推荐写法(Java 版)
前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...
- 单例模式简单解析--Singleton 单例模式(懒汉方式和饿汉方式)
单例模式的概念: 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 关键点: 1)一个类只有一个实例 这是最基本 ...
- IOS之Objective-C学习 ARC下的单例模式
单例模式是我常用的一种设计模式,最常见的用途就是用来保存数据并且传递数据.这都归功于单例模式的特性,首先就让我为大家简单介绍一下单例模式的特性. 单例模式的三大特性: 1.某个类只能有一个实例: 2. ...
- C#设计模式(1)——单例模式
一.概念:确保一个类只有一个实例,并提供一个全局访问点. 二.单例模式具备如下几个特点: 1.只有一个实例. 2.能够自我实例化. 3.提供全局访问点. 三.代码实现 1.简单实现 /// < ...
- 【转】单例模式(Singleton)
首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...
- 【转】单例模式(singletion)
单例模式(Singleton) 原地址:http://www.cnblogs.com/BoyXiao/archive/2010/05/07/1729376.html 首先来明确一个问题,那就是在某些情 ...
- PHP设计模式之:单例模式
前 些日子开始着真正的去了解下设计模式,开始么,简单地从单例模式开始,当然网上看了一些资料,单例模式比较好理解,看看介绍,然后看看代码基本也就能够理 解了,设计模式这些的花点心思基本的是能够理 ...
- 单例模式C#
首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...
- Java设计模式系列之单例模式
单例模式的定义 一个类有且仅有一个实例,并且自行实例化向整个系统提供.比如,多程序读取一个配置文件时,建议配置文件时,建议配置文件封装成对象.会方便操作其中的数据,又要保证多个程序读到的是同一个配置文 ...
随机推荐
- 浅谈java中的String、StringBuffer、StringBuilder类的区别以及关系
在java中最常见的使用就是对字符串的操作:首先先说一下对字符串的理解:字符串就是一连串字符序列,Java提供了String和StringBuffer两个类来封装字符串,并提供一系列方法来操作字符串对 ...
- Checked Exceptions
记得当年在程序员杂志上看出这次访谈,10多年过去了, 这件事儿最近被重提了, 原因是 Kotlin. 1.对Checked Exceptions特性持保留态度 (译者注:在写一段程序时,如果没有用tr ...
- 在IE浏览器中url传参长度问题
1.在这之前我一直以为,应该说是并没有去思考过,url地址传参的长度限制问题:知道在项目材料价格系统中遇到之后,才对这个问题进行了具体的探索.IE中最大的长度限制为2084个,用于get传递数据的长度 ...
- 卷积神经网络特征图可视化(自定义网络和VGG网络)
借助Keras和Opencv实现的神经网络中间层特征图的可视化功能,方便我们研究CNN这个黑盒子里到发生了什么. 自定义网络特征可视化 代码: # coding: utf-8 from keras.m ...
- 导入PrefixHeader.pch 报错UNknow The type "NSString",等基础类
进入到项目,在Buid Settings收索Compile Source 把Compile Source As 改成Objective-C问题即可解决.
- Mysql远程访问报错2003
如果没有权限新建一个mysql用户给添加远程连接的权限(推荐设置) 1.例如,你想admin使用123456从任何主机连接到mysql服务器的话. GRANT ALL PRIVILEGES ON *. ...
- centos7使用cronolog分割tomcat8.5的catalina.out日志
1.安装cronolog wget https://files.cnblogs.com/files/crazyzero/cronolog-1.6.2.tar.gz tar -zxvf cronolog ...
- django模型二
django模型二 常用模型字段类型 IntegerField → int CharField → varchar TextField → longtext DateFiel ...
- mysql trigger 备忘
最近用mysql有这么一个需求 item表:id,item,url,websiteid website表:id,domain item表示从不同网站获取的信息 website表示获得信息的网站,其中的 ...
- 12. Application-specific scanners (特定应用程序扫描器)
ike-scan是使用IKE协议发现.指纹和测试IPsec VPN服务器的命令行工具. 它通过向网络中的每个主机发送特制的IKE数据包来扫描VPN服务器的IP地址. 运行IKE的大多数主机都会响应,识 ...