亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP單例模式學習筆記詳解

2024-05-04 21:47:39
字體:
來源:轉載
供稿:網友

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

1.單例模式的概念

顧名思義,單例模式只有一個實例,而且自行實例化,向全局提供這個實例,需要強調的是,單例模式,確保某個類只能有一個實例!

2.單例模式的三個要點

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

private static $_instance;

(2)構造函數和克隆函數必須為私有的,防止用戶創建對象和復制實例對象,代碼如下:

  1. private function __construct() 
  2. //私有化默認構造方法,防止外界直接實例化 
  3. private function __clone() 
  4. //私有化克隆方法,防止用戶復制實例 

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

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

4.如何實現單例模式,代碼如下:

  1. <?php 
  2. /** 
  3.  * 單例模式示例:Demo 
  4.  */ 
  5. class Demo{ 
  6.  //靜態成員變量,用來保存全局實例 
  7.  private static $_instance
  8.  //私有化構造方法,保證外界不能直接實例化 
  9.  private function __construct(){ 
  10.  } 
  11.  //私有化克隆方法,防止用戶復制實例 
  12.  private function __clone(){ 
  13.  } 
  14.  //返還此類的唯一實例 
  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. //這樣實例化會出錯,因為構造方法為private 
  35. //$demo_new = new Demo; 
  36. //復制demo會出錯,因為默認的clone方法為private 
  37. // $demo_clone = clone $demo; 
  38. ?> 

5.單利模式的應用場合

(1)應用與數據庫的交互,多用于數據庫的連接

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

1、普通的數據庫訪問例子,代碼如下:

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

2、應用單例模式對數據庫進行操作,實例代碼如下:

  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. ?> 

深入理解,實例代碼如下:

  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.   * 查詢數據庫 
  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中有很多的設計模式,其中的單例模式是我們寫代碼的時候較為常用的一種模式,它不但能夠有效的減少new操作的資源消耗.而且能夠很方便的對某些全局配置信息進行控制!希望大家在php學習中深刻理解單例模式的應用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久免费高清视频| 日韩在线观看网站| 久久久噜噜噜久久久| 成人免费xxxxx在线观看| 欧美韩日一区二区| 国产经典一区二区| 国产精品专区h在线观看| 亚洲欧美一区二区激情| 欧美性一区二区三区| 国产免费观看久久黄| 亚洲欧美色图片| 欧美日韩亚洲一区二区三区| 狠狠躁18三区二区一区| 亚洲bt天天射| 国产综合久久久久久| 亚洲男人天堂古典| 日韩欧美在线观看| 欧美放荡办公室videos4k| 91精品国产高清| 在线观看日韩欧美| 97在线视频免费观看| 欧美做爰性生交视频| 欧美日韩中文字幕在线| 91精品久久久久久综合乱菊| 国产精品a久久久久久| 久久久免费电影| 亚洲男人天堂手机在线| 国产精品第100页| 欧美色播在线播放| 97视频在线观看视频免费视频| 国产精品视频999| 日韩欧美国产网站| 欧美xxxx做受欧美.88| 亚洲精品久久久久久久久久久久| 大胆人体色综合| 日韩美女免费视频| 理论片在线不卡免费观看| 欧美巨乳美女视频| 亚洲香蕉成人av网站在线观看| 狠狠色狠狠色综合日日小说| 亚洲精品女av网站| 亚洲色无码播放| 亚洲欧美另类在线观看| 日本欧美国产在线| 在线播放国产一区中文字幕剧情欧美| 热久久免费国产视频| 国产精品丝袜白浆摸在线| 久久综合国产精品台湾中文娱乐网| 成人福利视频在线观看| 成人av在线网址| 欧美夫妻性生活xx| 国产专区欧美专区| 亚洲精品自在久久| 国产日韩欧美视频在线| 69av在线视频| 国产欧美一区二区| 日韩av影视综合网| 91中文字幕在线观看| 精品久久中文字幕| 亚洲第一网站男人都懂| 国产一区二中文字幕在线看| 91热精品视频| 2019国产精品自在线拍国产不卡| 97av视频在线| 国产精品亚洲精品| 丝袜亚洲另类欧美重口| 欧美小视频在线观看| 久久精品成人欧美大片| 欧美另类69精品久久久久9999| 国产精品美腿一区在线看| 91色琪琪电影亚洲精品久久| 欧美大学生性色视频| 日韩中文字幕在线精品| 欧美日韩在线免费观看| 成人免费视频在线观看超级碰| 成人xvideos免费视频| 国产精品一区二区三区久久久| 国产精品久久97| 亚洲区在线播放| 欧美成人精品一区二区| 成人在线视频网| 久久久久中文字幕2018| 亚洲夜晚福利在线观看| 日韩av在线不卡| 国产三级精品网站| www.久久久久久.com| 欧美成人午夜免费视在线看片| 精品久久久久久中文字幕一区奶水| 精品视频久久久久久久| 亚洲精品www| 亚洲欧洲国产伦综合| 夜夜嗨av一区二区三区四区| 国产精品久久久久久久久久小说| 日本久久久久久久| 国产成人精品网站| 欧美精品激情在线| 久久亚洲私人国产精品va| 97视频在线观看网址| 91亚洲国产成人久久精品网站| 日韩av片永久免费网站| 伊人久久五月天| 亚洲天堂av综合网| 日韩欧美aⅴ综合网站发布| www.亚洲天堂| 欧美一区深夜视频| 亚洲精品国产精品自产a区红杏吧| 麻豆国产精品va在线观看不卡| 久久99精品久久久久久噜噜| 亚洲自拍小视频| 亚洲成色777777在线观看影院| 久久久999精品免费| 51视频国产精品一区二区| 日韩最新在线视频| 日韩男女性生活视频| 国产成人自拍视频在线观看| 久久久www成人免费精品| 国产精自产拍久久久久久蜜| 精品国产拍在线观看| 国产日韩欧美电影在线观看| 国产精品久久色| 7m第一福利500精品视频| 国产成人精品久久久| 国产成人综合久久| 亚洲综合中文字幕在线观看| 日韩va亚洲va欧洲va国产| 久久国产精品亚洲| 亲爱的老师9免费观看全集电视剧| 777午夜精品福利在线观看| 欧美成人免费全部| 福利微拍一区二区| 亚洲欧美日本伦理| 久久人人爽人人爽爽久久| 日韩黄色在线免费观看| 日韩av在线免费看| 国产精品一区二区久久精品| 亚洲成人网在线| 国产精品亚洲第一区| 久久99视频精品| 欧美日韩亚洲精品一区二区三区| 国产精品久久一| 精品人伦一区二区三区蜜桃免费| 3344国产精品免费看| 亚洲一区二区久久久久久| 亚洲综合色av| 亚洲天堂视频在线观看| 日韩免费观看av| 国产日韩欧美综合| 亚洲国产精品一区二区久| 亚洲另类xxxx| 亚洲大胆美女视频| 国产精品久久网| 日韩精品中文字幕在线| 国产精品综合久久久| 国产精品久久久久久久久久新婚| 亚洲国产精品久久久久久| 色婷婷成人综合| 日韩美女写真福利在线观看| 51ⅴ精品国产91久久久久久| 日韩av快播网址| 美女999久久久精品视频| 中文字幕精品视频| 国产精品欧美激情在线播放| 日韩中文娱乐网| 成人激情视频免费在线|