单例模式:一个对象只负责一个特定的任务,减少重复性任务.
以最常见的连接数据库为例
Database.php
<?php
class Database { //保存类实例的静态成员变量 private static $db; //private标记的构造方法,防止外部实例 private function __construct(){ } //创建__clone方法防止对象被复制克隆 public function __clone(){ trigger_error('Clone is not allow!',E_USER_ERROR); } //单例方法,用于访问实例的公共的静态方法 static function getInstance(){ //判断对象是否是自身类的实例 if(!(self::$db instanceof self)){ self::$db = new self; } return self::$db; }
}
index.php
<?php
//用new实例化private标记构造函数的类会报错 //$db= new Database(); //正确方法,用双冒号::操作符访问静态方法获取实例 $db= Database::getInstance(); //复制(克隆)对象将导致一个E_USER_ERROR $db_clone = clone $db;
new对象都会消耗内存,单例模式防止了重复new同一对象而产生的消耗.
之后不管有创建多少 $db= Database::getInstance(); 他们都共用同一个对象的.