class Database{
//4个私,一个公
//用于保存当前实例化后的对象
private static $instance = null;
private $db = null;
//构造方法声明为私有方法,禁止外部使用
private function __construct($config=array()){
$dsn = sprintf('mysql:host=%s;dbname=%s',$config['db_host'],$config['db_name']);
$this->db = new PDO($dsn,$config['db_user'],$config['db_pass']);
}
//获取当前容器的实例(单例)
public static function getinstance($config=array()){
if(self::$instance == null){
self::$instance = new self($config)
}
return self::$instance;
}
//获取数据库句柄
public function db(){
return $this->db;
}
//声明私有方法,禁止克隆
private function __clone(){}
//禁止重建对象
private function __wakeup(){}
}
$config = array(
'db_name' => 'tp_shop',
'db_host' => 'localhost',
'db_user' => 'root',
'db_pass' => ''
)
$db1 = Database::getinstance($config);
var_dump($db1);
【意图】
保证一个类仅有一个实例,并且提供一个访问它的全局访问点
单例模式有三个特点:
1、一个类只有一个实例
2、它必须自行创建这个实例
3、必须自行向整个系统提供这个实例
【单例模式结构图】
【单例模式主要角色】
Singleton 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类方法。负责创建它的唯一的实例。
【单例模式的优点】
1、对唯一实例的受控访问
2、缩小命名空间 单例模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染命名空间
3、允许对操作和表示的精华 单例类可以有子类。而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4、允许可变数目的实例(多例模式)
5、比类操作更灵活
【单例模式适用场景】
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
2、当这个唯一实例应该是通过子类化可扩展的。并且用户应该无需更改代码就能使用一个扩展的实例时。