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中简单工厂、工厂模式和抽象工厂的初步理解,感谢您的阅读
注:因本人的技术有限,如果有理解错误的地方,还请各位批评指正,共同交流学习,谢谢。我会继续努力的。