单例模式 也叫 单子模式,是一种常用的软件设计模式。 在应用这个模式时,可以确保一个类只能创建一个对象,这么做可以极大节省内存空间,有利于我们协调系统的整体行为。
使用单例模式创建的类(“单例类”)不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
单例模式一个主要应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄连接数据库的行为,使用单例模式可以避免大量的 new 操作,因为每一次 new 操作都会消耗系统和内存的资源。
实现单例模式的思路(三私一公):
- 私有的静态的对象实例;
- 私有的构造方法,在类外不能使用 new 创建对象;
- 私有的克隆方法,在类外不能使用 clone 克隆对象;
- 公共的静态的创建对象实例的方法。
代码:
<?php // 使用单例模式创建一个数据库连接类 class Mysql{ //该属性用来保存实例 private static $conn; //私有的构造函数,防止在类外创建对象 private function __construct(){ self::$conn = mysqli_connect('localhost','root','123456'); } //公共的创建对象的方法,如果不存在一个这个类的实例属性,就创建一个,否则就取这个实例属性。 public static function getInstance(){ if(!(self::$conn instanceof self)){ self::$conn=new self(); } return self::$conn; } //私有的克隆方法,防止在类外clone对象 public function __clone(){ } //防止反序列化后创建对象 private function __wakeup(){ trigger_error('Unserialized is not allowed !'); } } //只能这样取得实例,不能new和clone $obj1 = Mysql::getInstance(); $obj2 = Mysql::getInstance(); $obj3 = Mysql::getInstance(); var_dump($obj1, $obj2, $obj3);
运行结果:
object(Mysql)#1 (0) { } object(Mysql)#1 (0) { } object(Mysql)#1 (0) { }
通过运行结果可以看出,我们多次调用 getInstance() 方法并没有创建多个对象,所以说使用单例模式可以保证一个类只能创建一个对象,不能创建第二个对象。