单例模式 :使得类的一个对象成为系统中的唯一实例.
PHP中使用单例模式最常见的就是数据库操作了。避免在系统中有多个连接数据库的操作,浪费系统资源的现象,就可以使用单例模式。每次对数据库操作都使用一个实例。
简单示例
class AClass {
// 用来存储自己实例
public static $instance;
// 私有化构造函数,防止外界实例化对象
private function __construct() {}
// 私有化克隆函数,防止外界克隆对象
private function __clone() {}
// 静态方法,单例访问统一入口
public static function getInstance() {
if (!(self::$instance instanceof self)){
self::$instance = new self();
}
return self::$instance;
}
// test
public function test() {
return "done";
}
// 私有化克隆函数,防止外界克隆对象
private function __clone() {}
}
class BClass extends AClass{
}
// 获取实例
$aclass = AClass::getInstance();
$bclass = BClass::getInstance();
// 调用方法
echo $aclass->test();
对一些比较大型的应用来说,可能连接多个数据库,那么不同的数据库公用一个对象可能会产生问题,比如连接句柄的分配等,我们可以通过给$instance变成数组,通过不同的参数来控制
简单示例
class DB {
// 用来存储自己实例
public static $instance = array();
public $conn;
// 私有化构造函数,防止外界实例化对象
private function __construct($host, $username, $password, $dbname, $port) {
$this->conn = new mysqli($host, $username, $password, $dbname, $port);
}
// 静态方法,单例访问统一入口
public static function getInstance($host, $username, $password, $dbname, $port) {
$key = $host.":".$port;
if (!(self::$instance[$key] instanceof self)){
self::$instance[$key] = new self($host, $username, $password, $dbname, $port);#实例化
}
return self::$instance[$key];
}
//query
public function query($ql) {
return $this->conn->query($sql);
}
// 私有化克隆函数,防止外界克隆对象
private function __clone() {}
//释放资源
public function __destruct(){
$this->conn->close();
}
}