单例模式

来源:互联网 发布:淘宝定制品可以退货吗 编辑:程序博客网 时间:2024/06/05 10:14
单例模式:大家都知道类在具体被实例化对象的时候,会自动执行类内部的__construct()析构方法!!
因此想防止外部的不断进行实例化对象,对其析构方法(__construct())进行"保护":即protected,让外部不能直接进行实例化
思考:外部不能实例化该类,相当于关闭了一扇门,那么要打开一个出口进行该类的实例化!!而且应该在该类被继承(或者该类被克隆)之后还是一个对象

思路:

     1,先定义一个普通的类

     2,封锁外部 new 操作
     3,打开一个接口(唯一的路径) 可以进行 new 对象
     4,在唯一的开放方法中,先进行判断
     5,使用 final 来防止继承时,被修改权限(final:在方法前加上final,则该类被继承时内的方法不能被覆盖,若是类前加final,则该类不能被继承)

     6,防止被克隆

<?php

header("content-type:text/html;charset=utf-8");
 class Single{
 
   protected static $ins=null;

     public static function getIns(){
          if (self::$ins==null) {
                
                self::$ins=new single();
          }

         return   self::$ins;

     }
     
    final protected function __construct(){

    }

    protected function __clone(){
       
 
    }

 }
 /*//证明继承之后依然是同一个对象
  class Mi extends Single {

    
  }
  $g1 = Mi::getIns();
  $g2 = Mi::getIns();
  if ($g1===$g2) {
     
     echo " 是一个对象 ";
  }else{

        echo " 不是一个对象 ";
  }*/
 
 /* $g1 = Single::getIns();
  $g2 = clone $g1;//已经可以证明不能被克隆
  if ($g1===$g2) {
     
     echo " 是一个对象 ";
  }else{

        echo " 不是一个对象 ";
  }*/
$g1 = Single::getIns();
  $g2 = Single::getIns();
  if ($g1===$g2) {
     
     echo " 是一个对象 ";
  }else{

        echo " 不是一个对象 ";
  }




?>

0 0
原创粉丝点击