当前位置 博文首页 > 文章内容

    php中的单例模式

    作者:shunshunshun18 栏目:未分类 时间:2021-03-03 10:44:52

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    1.单例模式的由来

    是对现实生活中一类具有共同特征的事物的抽象,通过类的实例化,产生了许多的对象,但同时也产生了大量资源的消耗(例如在连接数据库时连接数量的限制,又例如在计算机中打开资源管理器却具有唯一性),由此也产生了对类的实例化进行了限定的需求,为了保护资源的唯一性,由此产生了单例模式

    2.单例模式的定义

    定义:单例模式singleton,是一种类的设计只会最多产生一个对象的设计思想。

    3.单例模式的实例

    a.创建一个空类 。

    <?php
       class Use{
       }
       $a=new Use();//实例化一个对象
    ?>

    b.能够多次实例化类,是产生多个对象的原因,所以可以通过私有化构造方法

    <?php
      class Use{
        private function __construct()
        {
          echo __FUNCTION__."<br>";
        }
       }
    ?>

    c.私有化构造方法使得实例化对象产生的数目为0,由此可以通过在类的内部,通过静态方法调用构造方法,然后将构造方法返回至外部。

    <?php
      class Use{
        private function __construct()
        {
         echo __FUNCTION__."<br>";
        }
        public static function getInstance()
        {
          return new self();
            }
       }
      $s1=Use::getSingleton();
    ?>

    d.通过上述的方法虽然能够实例化对象,但是同时也将构造方法的使用权限外放出去。如果想要该方法只返回一个对象,就得保证类内部有办法存着某个产生的对象,第一次产生新的,后面返回旧的。此时需要使用静态属性。

    <?php
      class Use{
        private static $object = NULL;//初始化为NULL,没有对象 
        
        private function __construct()
        {
          echo __FUNCTION__."<br>";
        }
        
        public static function getInstance()
        {  
          //判断类内部的静态属性是否存在对象
           if(!(self::$object instanceof self)){   //当前保存的内容不是当前类的对象
           self::$object = new self();
        }
          //返回对象给外部
           return self::$object;
        }
       }
      $s1=Use::getSingleton();
    ?>

    e.此时可以保证,通过调用静态方法只得到一个对象。但是依旧可以通过克隆,不停的实例化新的对象,所以可以将克隆私有化。

    <?php
      class Use{
        private static $object = NULL;//初始化为NULL,没有对象 
        
        private function __construct()
        {
          echo __FUNCTION__."<br>";
        }
        
        public static function getInstance()
        {  
          //判断类内部的静态属性是否存在对象
           if(!(self::$object instanceof self)){   //当前保存的内容不是当前类的对象
               self::$object = new self();
           }
          //返回对象给外部
           return self::$object;
        }
        
        
        private function __clone(){}   
       }
      $s1=Use::getSingleton();
    ?>

    推荐: