<?php
/*
单例模式
先看场景:
多人协同开发,都要调用Mysql的实例
如果用SVN知道,好多人一起开发,再提交各自的文件
A:
$mysql= new mysql();
$mysql->query()
测参通过
B:
$db=new mysql();
测试通过
...
...
两个人的代码要合到一块,如下
$mysql=new mysql();
$db=new mysql();
现在问题是存在了两个mysql的实例,而且每new一下,都要连接数据库
显然,一个页面呢,有一个mysql类的实例就够了
如何限制,让多人开发,无论你怎么操作,只能得到一个对象呢?
解决方法:单例模式
注:单例常用 也常考,多练习熟悉
第一步,一个普通的类
这个普通类,可以new来实例化
这显然不是单例
class MySingle{
}
$single=new MySingle();
$single2=new MySingle();
$single3=new MySingle();
*/
/*
第二步:看起来new是罪恶之源,干脆不让new了
我们把构造方法 保护/私有
外部不能new了
--但引出一个问题,不能new,那得不到对象,这不是单例,压根就是0例了
class MySingle{
protected function __construct(){
}
public function GetNew(){
return new self();
}
}
$single=new MySingle();
*/
/*
第三步
可以通过内部的static关键字,来调用
class MySingle{
public $hash;
public function __construct(){
$this->hash=mt_rand(1,999);
}
static public function GetNew(){
return new self();
}
}
$Mysingle=MySingle::GetNew();
$Mysingle2=MySingle::GetNew();
两个对象什么时间相等?
--只有指向同一个对象的时候才相等
var_dump($Mysingle);
var_dump($Mysingle2);
//结果出来两个对象都不是指向同一个对象
/*
第四步,通过内部的static方法实例化,
并且,把实例保存在类内部的静态属性上
这样就实现了一个单例模式
*/
class MySingle{
public $hash; /*随机码*/
static protected $ins=null;
final protected function __construct(){
$this->hash=mt_rand(1,999);
}
static public function GetNew(){
if(self::$ins instanceof self){ //instanceof 判断某个对象是不是某个类的实例
return self::$ins;
}else{
self::$ins = new self();
return self::$ins;
}
}
}
$Mysingle=MySingle::GetNew();
$Mysingle2=MySingle::GetNew();
/*
两个对象什么时间相等?
--只有指向同一个对象的时候才相等
*/
var_dump($Mysingle);
var_dump($Mysingle2);
//现在两个对象就是指向同一个对象了,单例模式初次完成
//现在有一个问题了
class SingSon extends Mysingle{
}
$singSon=SingSon::GetNew();
$singSon2=SingSon::GetNew();
var_dump($singSon);
var_dump($singSon2);
/*问题显示,继承之后单例模式就没用了
解决办法:final 最终的
final 关键词 在PHP中,可以修改类,方法名,但不能修改属性
*/
?>