当前位置:首页 > PHP教程 > php应用 > 列表

PHP单例模式定义与使用实例详解

发布:smiling 来源: PHP粉丝网  添加日期:2018-07-31 11:01:22 浏览: 评论:0 

先简单的介绍一下单例模式。单例模式就是在应用程序中保持某一个类实例只存在一个,而且不可以受外部环境的影响而生成这个类的第二个实例。它的优点,实际点见,如果在WEB开发中,保持单一个数据操作类实例的存在,可以减少不必要的多余连接数据库资源的消耗,对于大型的软件开发来说,可以使用单例来维持程序的状态,使不同操作实现同步,因为单例一直占据内存,而从不会有副本。

而对于PHP,使用单例最常用的场合莫过于写一个数据库操作类。不过在PHP中实现单例,有以下规则:

1)单例类必须拥有一个现式声明的构造函数,并且是私有的。

2)单例类必须有一个静态变量来存储类的实例,这样可以保持这个单例类就只有那么一个实例。

3)单例类必须提供一个静态方法,供其他所有的对象应用这个单例。

为什么要满足以上三个条件呢:

1)因为单例类在整个应用程序运行时,只能被创造一次,而且这种创造是不是通过外部调用而完成,而是自身完成。所以单例类是自己实例化自己,所以其构造函数必须是私有。任何其他外部对象都不可以再次构造一个单例类的副本。

2)因为单例类只能够自己实例化自己,而又要为所有外部应用提供自己的实例,所以类内部必须有一个可供外界访问,而又是唯一不变的访问存储对象点,所以要提供一个静态变量去存储单例类自己实例化自己的那个实例对象。

3)因为单例类的构造函数是私有的,所以单例类必须提供一个外部接口供外部环境调用单例类,所以必须有一个静态方法,它可以初始化单例类或者返回单例类的对象的引用。

一个简单的例子:

  1. classDB{ 
  2.    private$_link
  3.    //   保持单例类的静态变量 
  4.    static$_instance
  5.    //   私有的构造函数 
  6.    privatefunction__construct(){ 
  7.        $this->_link = @mysqli_connect(__HOST__, __USER__, __PASSWORD__, __DATABASE__); 
  8.        if(! ($this->_link)){ 
  9.           echo'Something wrong occurs on the database connection!'  
  10.        } 
  11.    } 
  12.    //   防止单例类被克隆 
  13.    privatefunction__clone(){} 
  14.    //   外界访问单例类实例的接口 
  15.    publicstaticfunctiongetInstance(){ 
  16.        if(! (self::$_instanceinstanceofself)){ 
  17.           self::$_instance=newself(); 
  18.        } 
  19.        returnself::$_instance
  20.    } 

注意,以上定义的一个 __clone() 函数,防止单例类对象被克隆。

以下也是一个简单的数据库操作类的单例,供参考:

  1. classDB { 
  2.    /** 
  3.     * the database connection 
  4.     * @var   resource 
  5.     * @access private 
  6.     */ 
  7.    private$_link
  8.    /** 
  9.     * the static instance of single db 
  10.     * @var   object 
  11.     * @access static 
  12.     */ 
  13.    static$_instance
  14.    /** 
  15.     * construct the single object 
  16.     * @return null 
  17.     * @access private 
  18.     */ 
  19.    privatefunction__construct(){ 
  20.        $this->_link = @mysqli_connect(__HOST__, __USER__, __PASSWORD__, __DATABASE__); 
  21.        if(! ($this->_link)){ 
  22.           echo'Something wrong occurs on the database connection!'  
  23.        } 
  24.    } 
  25.    /** 
  26.     * empty clone 
  27.     * @return null 
  28.     * @access private 
  29.     */ 
  30.    privatefunction__clone(){} 
  31.    /** 
  32.     * for other object to get the instance of db 
  33.     * @return self::instance 
  34.     * @access public 
  35.     */ 
  36.    publicstaticfunctiongetInstance(){ 
  37.        if(! (self::$_instanceinstanceofself)){ 
  38.           self::$_instance=newself(); 
  39.        } 
  40.        returnself::$_instance
  41.    } 
  42.    /** 
  43.     * query 
  44.     * @param  sql string 
  45.     * @param  message string 
  46.     * @return   resource 
  47.     * @access public 
  48.     */ 
  49.    publicfunctionquery($sql,$message){ 
  50.        $result= @mysqli_query($this->$_link,$sql)ordie($message. mysqli_error($this->$_link)); 
  51.        return$result
  52.    } 
  53.    /** 
  54.     * mysqli_num_rows 
  55.     * @param  result resource 
  56.     * @return   int 
  57.     * @access public 
  58.     */ 
  59.    publicfunctionnum($result){ 
  60.        return@mysqli_num_rows($result); 
  61.    } 
  62.    /** 
  63.     * mysqli_fetch_array 
  64.     * @param  result resource 
  65.     * @return   array 
  66.     * @access public 
  67.     */ 
  68.    publicfunctionfetchArr($result){ 
  69.        return@mysqli_fetch_array($result); 
  70.    } 
  71.    /** 
  72.     * mysqli_insert_id 
  73.     * @return   int 
  74.     * @access public 
  75.     */ 
  76.    publicfunctionlast_id(){ 
  77.        return@mysqli_insert_id($this->_link);   
  78.    } 
  79.    /** 
  80.     * close the database connection 
  81.     * @param  result resource 
  82.     * @return   null 
  83.     * @access public 
  84.     */ 
  85.    publicfunctionclose(){ 
  86.        @mysqli_close($this->_link); 
  87.    } 
  88.    /** 
  89.     * fetch once result from the specific sql query 
  90.     * @param  sql string 
  91.     * @param  message string 
  92.     * @return   array 
  93.     * @access public 
  94.     */ 
  95.    publicfunctionfetchArrOnce($sql,$message){ 
  96.        $result=$this->query($sql,$message); 
  97.        $row=$this->fetchArr($result); 
  98.        return$row
  99.    } 
  100.    /** 
  101.     * fetch all results from the specific sql query 
  102.     * @param  sql string 
  103.     * @param  message string 
  104.     * @return   array 
  105.     * @access public 
  106.     */ 
  107.    publicfunctionfetchArrMore($sql,$message){ 
  108.        $result=$this->query($sql,$message); 
  109.        $moreRow=array(); 
  110.        while($row=$this->fetchArr($result)){ 
  111.           $moreRow[] =$row
  112.        } 
  113.        return$moreRow
  114.    } 
  115.    /** 
  116.     * fetch the number of results from the specific sql query 
  117.     * @param  sql string 
  118.     * @param  message string 
  119.     * @return   array 
  120.     * @access public 
  121.     */ 
  122.    publicfunctionfetchNum($sql,$message){ 
  123.        $result=$this->query($sql,$message); 
  124.        $resultNum=$this->num($result); 
  125.        return$resultNum
  126.    } 
  127.    /** 
  128.     * mysqli_prepare 
  129.     * @param  sql string 
  130.     * @return   stmt object 
  131.     * @access public 
  132.     */ 
  133.    publicfunctionprepare($sql){ 
  134.        return@mysqli_prepare($this->_link,$sql); 
  135.    } 
  136.    /** 
  137.     * mysqli_stmt_execute 
  138.     * @param  stmt object 
  139.     * @param  message string 
  140.     * @return   bool 
  141.     * @access public 
  142.     */ 
  143.    publicfunctionstmt_execute($stmt,$message){ 
  144.        @mysqli_stmt_execute($stmt)ordie($message. mysqli_error($this->_link)); 
  145.    } 

使用:

  1. define("__HOST__","localhost"); 
  2. define("__USER__","root"); 
  3. define("__PASSWORD__",""); 
  4. define("__DATABASE__","eee"); 
  5. $db= DB::getInstance(); 

Tags: 实例 模式 单例PHP

分享到: