国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP單例模式學(xué)習(xí)筆記詳解

2024-05-04 21:47:39
字體:
供稿:網(wǎng)友

單例模式是php中一個為了簡化大家開發(fā)及重復(fù)調(diào)用的一個功能,下面我來給各位朋友詳細(xì)介紹單例模式用法。

1.單例模式的概念

顧名思義,單例模式只有一個實(shí)例,而且自行實(shí)例化,向全局提供這個實(shí)例,需要強(qiáng)調(diào)的是,單例模式,確保某個類只能有一個實(shí)例!

2.單例模式的三個要點(diǎn)

(1)需要一個靜態(tài)變量來保存類的唯一實(shí)例,代碼如下:

private static $_instance;

(2)構(gòu)造函數(shù)和克隆函數(shù)必須為私有的,防止用戶創(chuàng)建對象和復(fù)制實(shí)例對象,代碼如下:

  1. private function __construct() 
  2. //私有化默認(rèn)構(gòu)造方法,防止外界直接實(shí)例化 
  3. private function __clone() 
  4. //私有化克隆方法,防止用戶復(fù)制實(shí)例 

(3)必須提供一個公共的靜態(tài)方法(一般為getInstance),從而返回一個唯一實(shí)例的引用,實(shí)例代碼如下:

  1. public static function getInstance()     
  2. {     
  3.     if(! (self::$_instance instanceof self) )    
  4.     {     
  5.         self::$_instance = new self();     
  6.     }   
  7.     return self::$_instance;     
  8.    

3.php中使用單例模式的原因

PHP語言是一種解釋型的腳本語言,這種運(yùn)行機(jī)制使得每個PHP頁面被解釋執(zhí)行后,所有的相關(guān)資源都會被回收,也就是說,PHP在語言級別上沒有辦法讓某個對象常駐內(nèi)存,這和asp.net、Java等編譯型是不同的,比如在Java中單例會一直存在于整個應(yīng)用程序的生命周期里,變量是跨頁面級的,真正可以做到這個實(shí)例在應(yīng)用程序生命周期中的唯一性。然而在PHP中,所有的變量無論是全局變量還是類的靜態(tài)成員,都是頁面級的,每次頁面被執(zhí)行時,都會重新建立新的對象,都會在頁面執(zhí)行完畢后被清空,這樣似乎PHP單例模式就沒有什么意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現(xiàn)多個應(yīng)用場景并需要共享同一對象資源時是非常有意義的。

4.如何實(shí)現(xiàn)單例模式,代碼如下:

  1. <?php 
  2. /** 
  3.  * 單例模式示例:Demo 
  4.  */ 
  5. class Demo{ 
  6.  //靜態(tài)成員變量,用來保存全局實(shí)例 
  7.  private static $_instance
  8.  //私有化構(gòu)造方法,保證外界不能直接實(shí)例化 
  9.  private function __construct(){ 
  10.  } 
  11.  //私有化克隆方法,防止用戶復(fù)制實(shí)例 
  12.  private function __clone(){ 
  13.  } 
  14.  //返還此類的唯一實(shí)例 
  15.  public function getInstance(){ 
  16.   if(!(self::$_instance instanceof self)) 
  17.   { 
  18.    self::$_instance = new self(); 
  19.   } 
  20.   return self::$_instance
  21.  } 
  22.  //這是第一個測試方法 
  23.  public function test1Function(){ 
  24.   echo '這是第一個測試方法'
  25.  } 
  26.  //這是第二個測試方法 
  27.  public function test2Function(){ 
  28.   echo '這是第二個測試方法'
  29.  } 
  30. //正確的使用方法 
  31. @$demo = Demo::getInstance(); 
  32. $demo->test1Function(); 
  33. $demo->test2Function(); 
  34. //這樣實(shí)例化會出錯,因?yàn)闃?gòu)造方法為private 
  35. //$demo_new = new Demo; 
  36. //復(fù)制demo會出錯,因?yàn)槟J(rèn)的clone方法為private 
  37. // $demo_clone = clone $demo; 
  38. ?> 

5.單利模式的應(yīng)用場合

(1)應(yīng)用與數(shù)據(jù)庫的交互,多用于數(shù)據(jù)庫的連接

(2)如果系統(tǒng)中需要一個類來全局控制配置信息,用單例模式可以很方便的實(shí)現(xiàn)

1、普通的數(shù)據(jù)庫訪問例子,代碼如下:

  1. <?php 
  2. ...... 
  3. //初始化一個數(shù)據(jù)庫句柄 
  4. $db = new DB(...); 
  5. //添加用戶信息 
  6. $db->addUserInfo(...); 
  7. ...... 
  8. //在函數(shù)中訪問數(shù)據(jù)庫,查找用戶信息 
  9. function getUserInfo() 
  10.     $db = new DB(...);//再次new 數(shù)據(jù)庫類,和數(shù)據(jù)庫建立連接 
  11.     $db = query(....);//根據(jù)查詢語句訪問數(shù)據(jù)庫 
  12. ?> 

2、應(yīng)用單例模式對數(shù)據(jù)庫進(jìn)行操作,實(shí)例代碼如下:

  1. <?php 
  2. class DB   
  3. {   
  4.     private $_db;   
  5.     private static $_instance;   
  6.    
  7.     private function __construct(...)   
  8.     {   
  9.         $this->_db = pg_connect(...);//postgrsql   
  10.     }   
  11.    
  12.     private function __clone() {};  //覆蓋__clone()方法,禁止克隆   
  13.    
  14.     public static function getInstance()   
  15.     {   
  16.         if(! (self::$_instance instanceof self) ) {   
  17.             self::$_instance = new self();   
  18.         }   
  19.         return self::$_instance;   
  20.     }   
  21.     public function addUserInfo(...) 
  22.     { 
  23.    
  24.     } 
  25.      public function getUserInfo(...) 
  26.     { 
  27.     } 
  28. //test 
  29. $db = DB::getInstance(); 
  30. $db->addUserInfo(...); 
  31. $db->getUserInfo(...); 
  32.  
  33. ?> 

深入理解,實(shí)例代碼如下:

  1. <?php 
  2. class db { 
  3.  public $conn
  4.  public static $sql
  5.  public static $instance=null; 
  6.  private function __construct(){ 
  7.   require_once('db.config.php'); 
  8.   $this->conn = mysql_connect($db['host'],$db['user'],$db['password']); 
  9.   if(!mysql_select_db($db['database'],$this->conn)){ 
  10.    echo "失敗"
  11.   }; 
  12.   mysql_query('set names utf8',$this->conn);   
  13.  } 
  14.  public static function getInstance(){ 
  15.   if(is_null(self::$instance)){ 
  16.    self::$instance = new db; 
  17.   } 
  18.   return self::$instance
  19.  } 
  20.  /** 
  21.   * 查詢數(shù)據(jù)庫 
  22.   */ 
  23.  public function select($table,$condition=array(),$field = array()){ 
  24.   $where=''
  25.   if(!emptyempty($condition)){ 
  26.     
  27.    foreach($condition as $k=>$v){ 
  28.     $where.=$k."='".$v."' and "
  29.    } 
  30.    $where='where '.$where .'1=1'
  31.   } 
  32.   $fieldstr = ''
  33.   if(!emptyempty($field)){ 
  34.     
  35.    foreach($field as $k=>$v){ 
  36.     $fieldstr.= $v.','
  37.    } 
  38.     $fieldstr = rtrim($fieldstr,','); 
  39.   }else
  40.    $fieldstr = '*'
  41.   } 
  42.   self::$sql = "select {$fieldstr} from {$table} {$where}"
  43.   $result=mysql_query(self::$sql,$this->conn); 
  44.   $resuleRow = array(); 
  45.   $i = 0; 
  46.   while($row=mysql_fetch_assoc($result)){ 
  47.    foreach($row as $k=>$v){ 
  48.     $resuleRow[$i][$k] = $v
  49.    } 
  50.    $i++; 
  51.   } 
  52.   return $resuleRow
  53.  } 
  54.  /** 
  55.   * 添加一條記錄 
  56.   */ 
  57.   public function insert($table,$data){ 
  58.    $values = ''
  59.    $datas = ''
  60.    foreach($data as $k=>$v){ 
  61.     $values.=$k.','
  62.     $datas.="'$v'".','
  63.    } 
  64.    $values = rtrim($values,','); 
  65.    $datas   = rtrim($datas,','); 
  66.    self::$sql = "INSERT INTO  {$table} ({$values}) VALUES ({$datas})"
  67.   if(mysql_query(self::$sql)){ 
  68.    return mysql_insert_id(); 
  69.   }else
  70.    return false; 
  71.   }; 
  72.   } 
  73.   /** 
  74.    * 修改一條記錄 
  75.    */ 
  76.  public function update($table,$data,$condition=array()){ 
  77.   $where=''
  78.   if(!emptyempty($condition)){ 
  79.     
  80.    foreach($condition as $k=>$v){ 
  81.     $where.=$k."='".$v."' and "
  82.    } 
  83.    $where='where '.$where .'1=1'
  84.   } 
  85.   $updatastr = ''
  86.   if(!emptyempty($data)){ 
  87.    foreach($data as $k=>$v){ 
  88.     $updatastr.= $k."='".$v."',"
  89.    } 
  90.    $updatastr = 'set '.rtrim($updatastr,','); 
  91.   } 
  92.   self::$sql = "update {$table} {$updatastr} {$where}"
  93.   return mysql_query(self::$sql); 
  94.  } 
  95.  /** 
  96.   * 刪除記錄 
  97.   */ 
  98.   public function delete($table,$condition){ 
  99.    $where=''
  100.   if(!emptyempty($condition)){ 
  101.     
  102.    foreach($condition as $k=>$v){ 
  103.     $where.=$k."='".$v."' and "
  104.    } 
  105.    $where='where '.$where .'1=1'
  106.   } 
  107.   self::$sql = "delete from {$table} {$where}"
  108.   return mysql_query(self::$sql); 
  109.    
  110.   } 
  111.  public static function getLastSql(){ 
  112.   echo self::$sql
  113.  } 
  114. $db = db::getInstance(); 
  115. //$list = $db->select('demo',array('name'=>'tom','password'=>'ds'),array 
  116. ('name','password')); 
  117. //echo $db->insert('demo',array('name'=>'最近你啦','password'=>'123')); 
  118. //echo $db->update('demo',array("name"=>'xxx',"password"=>'123'),array('id'=>1)); 
  119. echo $db->delete('demo',array('id'=>'2')); 
  120. db::getLastSql(); 
  121. echo "<pre>"
  122. ?> 

php中有很多的設(shè)計模式,其中的單例模式是我們寫代碼的時候較為常用的一種模式,它不但能夠有效的減少new操作的資源消耗.而且能夠很方便的對某些全局配置信息進(jìn)行控制!希望大家在php學(xué)習(xí)中深刻理解單例模式的應(yīng)用。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 固阳县| 玉溪市| 通州市| 邓州市| 牡丹江市| 玉林市| 巴楚县| 云林县| 西宁市| 兴海县| 法库县| 河南省| 靖州| 榆树市| 成武县| 宣恩县| 丹寨县| 板桥市| 固阳县| 渭源县| 嘉峪关市| 弥渡县| 虞城县| 阜平县| 舒兰市| 平潭县| 务川| 黄石市| 卓资县| 光山县| 东方市| 道真| 太保市| 金昌市| 德惠市| 镇坪县| 顺昌县| 宜川县| 射阳县| 湟中县| 买车|