【前言】??
? ? ?本文总结下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方法不能被子类重写
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
.