Fork me on GitHub

php中的单例模式

最近在读《php面向对象、模式与实践》一书,正好读到了设计模式的相关章节,感觉需要整理下自己的学习内容,所以准备写写笔记,就当巩固和复习了。

今天我们先从最简单的模式——单例模式开始。

首先,我们需要知道,什么是单例模式?

定义:生成一个且只生成一个对象实例的特殊类。

其次:单例模式有哪些使用场景?什么地方会用到单例模式呢?

在我们平常开发中,单例模式使用场景还是比较多,比如说数据库对象。

据我分析在这里使用单例模式有四个原因:

1.数据库对象在任何地方需均可访问和使用,类似于全局变量。

2.但是数据库对象又不应该存储在会被覆写的全局变量中,容易被覆写。

3.系统中只需要一个数据库对象,这样可以保证在一处进行查询,在另外一处可以此次查询的信息(即数据同步)

总结:

上面三条其实也是单例模式使用的信号,如果业务出现上述的要求时,就说明可以使用单例模式了。

最后:如何使用php实现单例模式?

具体代码如下:

 1 <?php
 2 # 单例模式实现代码 create by diysnake
 3 class singleTon
 4 {
 5     # 用来存储单例对象的私有静态属性
 6     private static $instance;
 7 
 8     # 构造函数,private用来防止直接实例化
 9     private function __construct()
10     {
11         
12     }
13  
14     # 用来实例化单例对象的静态方法
15     public function getInstance()
16     {
17         if(empty(self::$instance))
18         {
19             self::$instance = new self();
20         }        
21         return self::$instance;
22     }    
23 }

以上代码需要注意的地方如下:

1.$instance变量必须是static的,因为静态方法getInstance中无法使用$this来访问对象属性,只能通过关键字self来获取类中的静态属性;还有,因不允许用户在外部直接使用singleTon::$instance获取该变量的值,所以$instance变量必须是private或者protected的。

2.构造函数的权限修饰符需要使用private或者protected,这样当开发人员直接在外部使用new实例化该类时,会给出权限相关的错误,可以指引其正确的实例化该类。

3.getInstance静态方法中先判断self::$instance是否有值,如果有直接返回;如果没有,则实例化后再返回 

 

当然单例模式的具体代码有多种,这里给出的是其中一种。

 

以上就是我对php中简单工厂、工厂模式和抽象工厂的初步理解,感谢您的阅读

注:因本人的技术有限,如果有理解错误的地方,还请各位批评指正,共同交流学习,谢谢。我会继续努力的。

 

posted @ 2016-11-07 10:50  lovecucu  阅读(192)  评论(0编辑  收藏  举报