单例
来源:互联网 发布:2017年最污的网络热词 编辑:程序博客网 时间:2024/04/30 09:15
// 创建一个单例模式的mysql类
/*
所用知识点:
构造函数
权限修饰符
静态属性
对象克隆
final类
*/
// 单例第1步,先写一个普通的类
/*
class mysql {
private $id;
public function __construct() {
$this->id = rand(1,10000);
}
}
$m1 = new mysql();
$m2 = new mysql();
*/
// 单例第2步,写一个不允许new的类
/*
class mysql {
private $id;
protected function __construct() {
$this->id = rand(1,10000);
}
}
$m1 = new mysql();
*/
// 单例第3步, 开放一个静态,公共的接口, 来从内部new得到实例
/*
class mysql {
private $id;
protected function __construct() {
$this->id = rand(1,10000);
}
public static function getIns() {
return new self();
}
}
$m1 = mysql::getIns();
$m2 = mysql::getIns();
print_r($m1);
print_r($m2);
if($m1 === $m2) {
echo '是一个对象';
} else {
echo '不是一个';
}
*/
// 单例第4步, getIns加一个判断,
// 如果不存在,则new一个实例,并保存该实例,然后return 该实例.
// 如果已经存在实例,则直接return该实例,
// 该实在存放在哪儿?
class mysql {
private $id;
private static $ins = false;
public $age = 22;
protected function __construct() {
$this->id = rand(1,10000);
}
public static function getIns() {
// return new self();
if(self::$ins === false) {
self::$ins = new self();
}
return self::$ins;
}
}
$m1 = mysql::getIns();
$m2 = mysql::getIns();
$m3 = $m2; // 由于 对象的引用传值特性
/*
print_r($m1);
print_r($m2);
print_r($m3);
if($m1 === $m3) {
echo '是一个对象';
} else {
echo '不是一个';
}
*/
// 接下来,破解单例的特性
// 用克隆和继承,都能够使单例失效
// 解决: 预习魔术方法__clone, final关键字
/*
$m4 = clone $m3;
if($m1 === $m4) {
echo '是一个对象';
} else {
echo '不是一个';
}
class db extends mysql {
private $id;
public function __construct() {
$this->id = rand(1,1000);
}
}
$db1 = new db();
$db2 = new db();
print_r($db1);
print_r($db2);
if($db1 === $db2) {
echo '是一个对象';
} else {
echo '不是一个';
}
*/