PHP单例模式

【前言】  

     本文总结下PHP单例模式相关

 

【主体】单例模式

简单理解:单例就是类只能被实例化一次,只能得到一个对象

购物商场用到单例模式

思路:按步骤分为

     1. 创建普通类;2. 保护构造方法,封装起来(保护后不能调用);3. 所以要在封装后在内部调用,从而实现对外开放一个接口;

     4.设为静态,移除控制权,从而不实例化调用;5.  添加判断;6. final禁止继承

单个实例对象,即只能实例化一个对象

①普通类的实例

<?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方法不能被子类重写

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

猜你喜欢

转载自570109268.iteye.com/blog/2414499