<?php
/**
* 1.4 单例模式
* 解决的问题:
* 如何确保一个特殊类的实例是独一无二的
* ,也就是说这个实例是它所属类的唯一一
* 个实例对象,并且很容易的对它进行存取?
* 解决的方案:
* 保证一个类仅有一个实例,并提供一个访
* 问它的全局访问点。
* 该模式包含一种角色:
* 1. 单例角色
* 优点:
* 1. 始终保持唯一的一个实例。
* 2. 可对此唯一实例进行访问控制。
* 缺点:
* 1. 虽然实例数量很少,但每次请求引用时
* 都要检查是否存在类的实例,所以仍然
* 存在一些开销。可以通过使用静态初始
* 化解决此问题。
* 2. 因为不能实例化,所以开发人员必须记
* 住某个类不能使用new关键字产生对象。
*
* 使用场景:
* 1. 当类只能有一个实例而且客户可以从一
* 个众所周知的访问点访问它时。
* 2. 当这个唯一实例应该是通过子类化可扩展
* 的,并且客户应该无需改代码就能使用一
* 个扩展的实例时。
*/
/**
* 单例角色,三要素:
* 1. 必须有一个静态成员变量保存实例;
* 2. 只提供私有的构造函数;
* 3. 必须有一个静态函数用于创建获取
* 静态成员变量。
* 4. 私有化克隆函数
*/
class DB{
private $con;
protected static $db;
private function __construct(){
$this->con=new mysqli(‘localhost‘,‘root‘,‘123456‘,‘test‘);
echo ‘建立一次数据库连接‘;
}
public static function getInstance(){
if(! self::$db instanceof self){
self::$db=new self();
}
return self::$db;
}
private function __clone(){}
}
//客户端
$db=DB::getInstance();
$db2=DB::getInstance();
// $db3=clone $db;
echo $db===$db2 ? ‘OK‘:‘NO‘;
?>本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614771
原文:http://noican.blog.51cto.com/4081966/1614771