【前言】??
? ? ?本文总结下PHP单例模式相关
?
【主体】单例模式
简单理解:单例就是类只能被实例化一次,只能得到一个对象
购物商场用到单例模式
思路:按步骤分为
? ? ?1. 创建普通类;2. 保护构造方法,封装起来(保护后不能调用);3. 所以要在封装后在内部调用,从而实现对外开放一个接口;
? ? ?4.设为静态,移除控制权,从而不实例化调用;5.? 添加判断;6. final禁止继承
单个实例对象,即只能实例化一个对象
①普通类的实例
class="php"><?php
class Single{
public $rand;
public function __construct(){
$this->rand = mt_rand(10,300);//mt_rand()随机数
}
}
var_dump(new Single());//115
var_dump(new Single());//148
?>
?
这里我实例化了类两次,得到两个对象,且两次数值不一样。由此总结出一个类可以实例化出多个对象。
②单例模式案例
实例化放到类里,加上条件判断
<?php
class Single{
public $rand;
static public $ob;
protected function __construct(){
$this->rand = mt_rand(10,300);//随机数
}
static public function out(){
if (Single::$ob === null) {//判断是否实例化
Single::$ob = new Single();
}
return Single::$ob;
}
}
var_dump(Single::out());//输出222
var_dump(Single::out());//输出222
?>
?
两次输出一样
上例还未完成,因为继承后的子类里再次实例化时,还是会产生多个不同结果
<?php
class Single{
public $rand;
static public $ob;
//final不允许被子类重写
protected function __construct(){
$this->rand = mt_rand(10,300);//随机数
}
static public function out(){
if (Single::$ob === null) {//判断是否实例化
Single::$ob = new Single();
}
return Single::$ob;
}
}
class Test extends Single{
public function __construct(){
echo rand(20,300);//此处被子类重写
}
}
new Test();
new Test();
?>
?
对此我们用final来禁止重写,因为final类不能被继承,且final方法不能被子类重写
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
.