前言:本系列为每周六发布一篇(直至本系列完结),本系列需要有一定的PHP基础,希望能给尚未了解PHP设计模式的同学带来一定的收获,若本篇文章存在误解的欢迎大家指出,如果你喜欢本篇文章欢迎转发并点赞,内容转载无需向作者申请,请注明本篇文章作者与链接即可,谢谢。
首先在学习单例模式之前,是否有了解过什么是设计模式?我相信有绝大多数的同学在尚未接触设计模式的时候,都认为设计模式是被程序规定的。其实设计模式它只是一种思想,是用语言表达出来的,它不仅限制于 PHP 当中,还有 Java、C# 等其他编程语言都可以采用这种思想去组织项目中的代码,那么设计模式的概念到底是什么,为什么我们要使用它们,它们能带来哪些好处?
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
看完上面这段文字我相信从字面上理解大家是没有问题,那么我总结出来的设计模式有两大特征:代码可复用性、代码可维护性。我相信大家现在已经知道我们为什么要使用设计模式的思想去组织代码了。设计模式设计出来主要的目的都是为了统一解决一些特定的问题,最终还是需要根据不同的场景去结合的使用,滥用设计模式也是不合理的。
好了基本概念我们就讲那么多,我们大致理解了设计模式之后,开始我们今天的【跟着小马学习PHP设计模式】一、单例模式。
我们快速的过一下什么是单例模式,简单来说通过单例模式可以保证系统中,应用该模式中的一个类只有一个实例。即一个类只有一个对象实例,而在 PHP 应用当中,最常见使用该模式的类是 “数据库操作类”。
为什么要在 “数据库操作类” 中使用该模式?首先在 PHP 项目当中,最常见的就是与数据库打交道,那么我们会有大量的数据库操作方法,如果我们不使用“单例模式”,可能会出现大量的 new 实例,每次实例都进行了一次数据库连接,如果一个类中出现多次数据库连接,那会对数据库造成很大的压力,那我们使用“单例模式”之后我们就可以避免大量的 new 实例所带来的资源消耗,保证一个类中只有一个对象实例,数据库连接只会存在一次。
那么 “单例模式” 运用到 PHP 当中需要注意以下三点:
1、一个类中的构造函数需要标记为 private,防止外部直接 new 实例;
2、需要申明一个保存类实例的静态成员变量;
3、需要公开一个获取实例的公共的静态方法。
接下来我们直接实例,我们先在 wwwroot 目录下新建文件夹(自行搭建环境,通常根目录为 wwwroot,文件夹命名为 design_pattern,接下来的学习我们将会在该文件夹内创建 php 文件)。
打开编辑器(推荐一款好用的 IDE:phpstrom),创建一个 “Single.php” 文件,遵从驼峰命名,文件名首字母大写,类名与文件名保持一致。
类创建完毕后,我们先将构造函数标记为 private 私有的,接着我们先试一下如果外部进行了实例化操作后会发生什么,打开 Terminal 输入php Single.php运行一下(如果不熟悉命令行操作请直接浏览器访问该文件即可)。
我们发现报Call to private Single::__construct() from invalid context,这没毛病,已经确定外部不能直接实例化了。
接下来我们先申明一个私有的静态成员变量 $instance,然后在创建一个对外公开的单例静态方法 getInstance(关键字 static)。代码如下:
因为我们已经不能再通过 new 操作来实例化一个类了,所以我们需要在getInstance 方法内部进行实例化,静态属性需要通过 self 关键字访问,new self 就是实例化自身这个类。代码如下:
然后我们再创建一个对外的公开的hello方法用于测试单例。完整的代码如下:
这时候我们直接访问对外公开的静态方法 getInstance,静态方法用两个冒号(::)访问,我们将其赋值给 $single 变量,紧着再用 $single 变量访问 hello 方法,在 Terminal 中运行一下,Hello php 就被输出了。
我们接着来试下这种情况,一个类中多次访问getInstance静态方法,并赋值给不同的变量。代码如下:
在 getInstance静态方法中添加 echo “save new self\n”; 并在 Terminal 中运行一下。
结果只出现了一次,说明我们在一个类中保存了一次实例之后,无论后面如何操作都保证这一个类中只有这一个对象实例。
常见的“单例模式”下的应用场景:数据库连接、缓存操作、分布式存储、配置读取操作等等。
今天的“单例模式”就讲到这里,本次“单例模式”学习的完整代码如下:
领取专属 10元无门槛券
私享最新 技术干货