单例模式

<?php
class DB {
private $_db;
//静态是通过类::字段直接访问的,private表示外部不能访问
static private $_instance;
//访问这个实例的公共静态方法
static public function getInstance() {
//如果对象没有创建,就创建它,如果创建了,就直接返回
if (!(self::$_instance instanceof self)) {
self::$_instance = new self();
}
return self::$_instance;
}
//单一职责问题,私有化克隆
private function __clone() {}
//私有化构造方法,
private function __construct() {
try {
$this->_db = new PDO('mysql:host=localhost;dbname=cms','root','yangfan');
echo '创建了一次数据库链接对象';
} catch (PDOException $e) {
exit($e->getMessage());
}
}
public function query($_sql) {
return $this->_db->query($_sql);
}
}
?>

 

单例类所需的三个公共元素:
1.必须拥有一个构造方法,并且必须被标记为 private;
2.拥有一个保存类的实例的静态成员属性(字段);
3.拥有一个访问这个实例的公共的静态方法。

虽然全局变量可以实现单例, 让整个内存流程清晰, 让对象保持一个, 但这是有代价的:
1.全局变量处在特定的区域环境,破坏了整个类的封装;
2.如果新的应用程序无法保证一开始就定了相同的全局变量, 那么这个类依赖与全局变
量,就无法从一个应用中提取出来应用到新的应用程序上。(PS:因为没有封装在类里,如
果全局变量不是在 DB.class.php,而是单独文件,往往就提取不到)。
3.全局变量不受保护,也就是说,可以任意存放和修改。一旦依赖全局,随着项目的扩
展,冲突在所难免。因为全局不变量不像类中的成员属性,如果冲突会提示警告报错,而全局变量不会。

4.全局变量,并没有真正实现单例,如果在程序中不遵循类库提供个规范,而自己创建类,则还是会产生多个对象。

posted @ 2015-05-10 12:09  何君  阅读(120)  评论(0编辑  收藏  举报