单例模式
概念单例模式是一种常见的“设计模式”!
什么是设计模式?
所谓的设计模式,并不是一种新的语法,而是人们在实际的应用中面对某种特定的情形而设计出来的某种常见的有效的解决方案,只是经验的总结!
单例就是单一的实例!
意义:
在实际的应用中,我们发现,存在一些类只需要实例化出来一个对象,就是可以完成所有的操作和功能,一个典型的就是MySQLDB类(对数据库的操作)
所以,如果我们能通过某些技巧从语法上使得一个类只能开辟一个对象空间的话,就可以节省相应的对象资源,这种模式就叫作单例模式!
实现方法
第一步:防止用户通过new关键字无限实例化新对象基本策略:在new一个对象的时候,会自动触发构造方法,只需要把这个构造方法私有化,类外就无法new一个新的对象了!
第二步:增加一个静态的公共方法,进入类的内部
思考:
1,为什么要静态?
因为此时暂时还无法得到一个对象,只能通过类来访问这个方法
2,为什么是公共的?
因为是类外访问!必须公开!
此时,如果用户想得到一个对象,就必须通过类名调用这个静态方法,但是,用户此时又可以通过反复调用这个方法得到很多个新的对象空间!
基本策略:用户第一次调用的时候,可以得到一个新的对象,第二次(后续调用)调用的时候,返回第一次已经实例化好了的那个新对象!我们可以增加一个私有的静态属性,当用户第一次调用的时候,先实例化一个新的对象放到这个私有的静态属性中保存,然后返回这个私有属性的值(保存的就是一个对象),当用户后续的调用的时候,首先判断这个私有属性里面是不是保存了一个对象,如果是,直接把这个私有属性的值返回即可!
第三步:为当前类增加一个私有的静态属性
思考:
1,为什么是私有的?
因为我们要确保在类外无法修改该属性的值!
2,为什么是静态的?
因为此时需要使用类来调用这个属性!
但是,还有一个问题,用户还可以通过clone关键字得到一个新的对象空间
第四步:将克隆魔术方法私有化
因为在克隆一个对象的时候,会自动触发执行__clone()魔术方法,只需要将方法同构造方法一样私有化即可:
以上的四步,就是实现单例模式的最典型的做法:"三私一公".
<?php
class MySQLDB {
// 3, 增加一个私有属性,用户保存对象
private static $instance;
// 1, 私有化构造方法
private function __construct() {
}
// 2, 增加静态公开方法
public static function getInstance () {
// 判断当前对象是否已经存在
if(!self::$instance instanceof self) {
self::$instance = new self;
}
return self::$instance;
}
// 4, 私有化__clone魔术方法
private function __clone() {
}
}
?>