PHP 单例模式

    q:什么是 单例模式 ?
    a:单例模式 就是让某个类的对象(实例)只能出现一次(且一直存在)。主要使用:静态属性、静态方法。
 
    需要单例模式的场景,例如:
    ① 使用 Mysql类 时,每一次实例化都会连接一次数据库,同时增加一个对象(实例)。所以同一个 Mysql类 创建多个对象(实例)每必要,增大了开销、浪费了资源。
    ② 实现 购物车 时,如果 用户打开了多个页面,每个页面实例化一个购物车对象(实例),那么用户在各个页面中下的订单就会被装到不同的购物车里,这样就会出现错误。
 
    注意:PHP中的单例,只是以脚本为单位的单例。
 
    实现步骤为以下 4 步:
 
    class DanLi{
 
        /*
            第一步:不允许该类直接进行 new 操作。因为当类被实例化时会自动调用其 构造方法__construct(),而现在把其构造方法声明为 protected 即受保护的。就是说不让外界调用其构造方法,从而阻止该类被直接实例化。
            最后对其构造方法声明为 final 即不允许该构造方法被重写。(如果用 final 声明类即不允许该类被继承)
        */
        final protected function __construct(){
 
        }
 
        /* 第二步:在类的内部打开一个通道,来实例化对象。*/
        static protected $obj = null;    //创建一个静态属性,用于接收该类实例化的对象。
 
        static public function makeObj(){    //创建一个静态方法作为通道。
 
            /* 第三步:判断该类的实例是否已经存在。*/
            if(self::$obj == null){
                self::$obj = new self(); //实例化本类,并将本类的实例 存放在本类的静态属性 $obj 中。
            }
            return self::$obj;
        }
 
        /* 第四步:不允许对象克隆。*/
        protected function __clone(){
 
        }
    }
 
 
    $obj1 = DanLi::makeObj();
    $obj2 = DanLi::makeObj();
 
    /*
        注意:在 PHP 中,连个对象(实例)进行“全等于”关系运算,例如:if($对象1 === $对象2){……}
        在这种情况下,就算两个对象的属性和属性值完全一样,也不会相等。只有一种相等的可能性:这两个对象是同一个对象。
    */
    if($obj1 === $obj2){
        echo '是同一对象';
    }else{
        echo '不是同一个对象';
    }

 

posted @ 2017-11-10 20:32  Uncle_Jay  阅读(114)  评论(0编辑  收藏  举报