彻底认清PHP单例模式
What–什么是单例模式呢?
首先我们明确单例模式这个概念,正如其名称一样,单例模式是指整个应用(呵呵,你可能会问什么应用阿?还是有些抽象,别急,下面我们会举例说明)中类只有一个对象实例的的设计模式。
Why–为什么要使用PHP单例模式?
PHP的一个主要应用场合就是应用程序与数据库打交道的应用场景,所以一个应用中会存在大量的数据库操作,比如过数据库句柄来连接数据库这一行为,使用单例模式可以避免大量的new操作,因为每一次new操作都会消耗内存资源和系统资源。
还是有些抽象,给出代码片段。
使用传统方式编码
01
|
<?php
|
02
|
......
|
03
|
//初始化一个数据库句柄
|
04
|
$db = new DB(...);
|
05
|
//比如有个应用场景是添加一条用户信息:
|
06
|
$db ->addUserInfo();
|
07
|
......
|
08
|
//然而我们在另外一个地方可能要查找用户的信息,这个情景出现在一个函数中,这时要用到数据库句柄资源,我们可能需要这么去做
|
09
|
......
|
10
|
function test(){
|
11
|
......
|
12
|
//这时我们不得不重新初始化一个数据库句柄,试想多个应用场景下,这样的代码是多么可怕啊?!
|
13
|
$db = new DB(...);
|
14
|
$db ->getUserInfo();
|
15
|
......
|
16
|
//有些朋友或许会说,我也可以不这样做啊,我直接利用global关键字不就可以了吗?的确,global可以解决问题,也起到了单例模式的作用,但是OOP中,我们拒绝这样来编写代码,因为global存在安全隐患,请参考相关书籍,同时单例模式恰恰是对全局变量的一种改进,避免了那些存储唯一实例的全局变量污染命名空间
|
17
|
global $db ; //OOP中,我们不提倡这样编写代码
|
18
|
......
|
19
|
}
|
使用单例模式编码
1
|
<?php
|
2
|
......
|
3
|
//所有的应用情景只有一个数据库句柄资源,嘿嘿,效率老高了,
|
4
|
//资源也大大的得到节省,代码简洁明了:)
|
5
|
DB::getInstance()->addUserInfo();
|
6
|
DB::getInstance()->getUserInfo();
|
7
|
......
|
How–如何来编写PHP单例模式?
在了解了单例模式的应用场景之后,下面我们通过编写单例模式的具体实现代码来掌握PHP单例模式的核心要点,代码如下:
01
|
<?php
|
02
|
/**
|
03
|
* PHP单例模式演示举例
|
04
|
* @author guohua.li
|
05
|
* @modify 2010-07-11
|
06
|
* @website http://blog.163.com/lgh_2002/
|
07
|
*/
|
08
|
class User{
|
09
|
/**
|
10
|
* 静态成品变量 保存全局实例
|
11
|
* @access private
|
12
|
*/
|
13
|
static private $_instance = NULL;
|
14
|
/**
|
15
|
* 私有化构造函数,防止外界实例化对象
|
16
|
*/
|
17
|
private function __construct() {}
|
18
|
/**
|
19
|
* 私有化克隆函数,防止外界克隆对象
|
20
|
*/
|
21
|
private function __clone(){}
|
22
|
/**
|
23
|
* 静态方法, 单例统一访问入口
|
24
|
* @return object 返回对象的唯一实例
|
25
|
*/
|
26
|
static public function getInstance() {
|
27
|
if ( is_null (self:: $_instance ) || !isset(self:: $_instance )) {
|
28
|
self:: $_instance = new self();
|
29
|
}
|
30
|
return self:: $_instance ;
|
31
|
}
|
32
|
/**
|
33
|
* 测试方法: 获取用户名字
|
34
|
*/
|
35
|
public function getName() {
|
36
|
echo 'hello liguohua!' ;
|
37
|
}
|
38
|
}
|
从以上代码中,我们总结出PHP单例模式实现的核心要点有如下三条:
1. 需要一个保存类的唯一实例的静态成员变量(通常为$_instance私有变量)
2. 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序new类从而失去单例模式的意义
3. 必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用
PHP单例模式的缺点
众所周知,PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。
彻底认清PHP单例模式相关推荐
- PHP单例模式的本质
相信很多朋友利用PHP在进行Web开发时都会用到设计模式,其中单例模式应该是应用最多的模式之一,本文并不讨论PHP的各种设计模式,而是重点和大家一起来分析.探讨.分享我自己对PHP单例模式的通俗认识和 ...
- 使用严格模式的坏处_再见面试官:单例模式有几种写法?
点击上方"JAVA",星标公众号重磅干货,第一时间送达 饱汉模式 饿汉模式 Holder模式 枚举模式 丑陋但好用的语法糖 总结 " "你知道茴香豆的'茴'字有 ...
- 认清自己,就能活出更好的自己
我小的时候,很讨厌父母安排我去做些我很不喜欢做的事:从那时起,我就开始认识了自己,认清自己想做什么,想为什么样的人. 我觉得我的童年不是童年:因为在我记事起,没有玩具,没有父母的疼爱,没有我自由的空间 ...
- 认清自己,愉快度过每一天
生活中,有的人,总以一种低调的姿态与人相处,谦虚谨慎,从不高估自己.有的人恃才傲物,生怕别人看不到他的优势,时常错估自己在别人心里的分量.把自己掂得重,往往被人看得轻. 一个人想要站得稳,走得更远,除 ...
- Java单例模式个人总结(实例变量和类变量)
Java单例模式 背景知识:Static关键字. 在对于定义类的变量,分为两种,是否具有static修饰的变量: 没有static修饰的变量,通过类的实例化(对象)引用,改变量称为实例变量: 使用st ...
- GOF23设计模式(创建型模式)单例模式
目录: 一:单例模式的核心作用.常见应用场景 二:五种单例模式及其实现 三:关于反射和反序列化破解单例模式的漏洞,以及相应的解决方案 四:测试五种单例模式的效率 一:核心作用及常见应用场景: 核心作用 ...
- Java设计模式:单例模式
学而时习,稳固而之心, 好久没有复习java的知识了,今天有空温习了单例模式,这里记录一下 单例模式是常见的设计模式的一种,其特点就是 指一个类只有一个实例,且该类能自行创建这个实例 , 保证一个类 ...
- [Python设计模式] 第21章 计划生育——单例模式
github地址:https://github.com/cheesezh/python_design_patterns 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式 ...
- Python 精选笔试面试习题—sorted 与 sort 单例模式、统计字符个数Count、垃圾回收、lambda函数、静态方法、类方法、实例方法、分布式锁、
1. 字典根据键从小到大排序? In[38]: dic = {"name": "Tom", "age": 30, "country ...
最新文章
- php jwt使用案例,PHP使用JWT创建Token的实例详解
- SCons — 程序构建工具
- MAC上最好用的免费全能音乐播放器VOX 2.6.5
- 2-21-源码编译安装LAMP
- SQL Server 2008支持将数据导出为 insert into 的脚本
- data fastboot 擦除_fastboot使用教程
- lua 斗地主癞子牌型检测中使用递归
- 15年来 那些值得永远铭记的硬件
- Codewars 刷题笔记(Python)6.Multiples of 3 or 5
- 互联网大佬纷纷搞养殖,这是为哪般~~~
- 使用spring的优势
- 从输入url到页面加载完成中间都发生了什么?
- Abaqus idle 3600 seconds 或 Process terminated by external request 问题解决
- 前端面试题整理(会不断更新哦!~~~~~)
- 方维直播源码:*****我是如何搭建网络视频直播平台的*****
- 2021年9月Github优秀项目推荐
- NFC毕业纪念卡:小小车票,致逝去青春
- 创建Abp+.net 6+Mysql 项目
- 截屏录屏工具(免费解压版)
- java线上医药用品分销系统设计与实现计算机毕业设计MyBatis+系统+LW文档+源码+调试部署