有關php單例模式介紹及例子

WBOY
發布: 2016-07-25 09:07:28
原創
933 人瀏覽過
  1. private static $_instance;
複製程式碼

2)、建構函式和複製函式為私有的,防止外部程式new類別從而失去單例模式的意義:

  1. private function __construct()
  2. {
  3. $this->_db = pg_connect('xxxx');
  4. }
  5. }
  6. ; private function __clone()
  7. {
}//覆蓋__clone()方法,禁止複製
複製程式碼

(3).必須提供一個存取這個實例的公共的靜態方法(通常為getInstance方法),從而傳回唯一實例的一個引用
  1. public static function getInstance()
  2. {
  3. if(! (self::$_instance instanceof self) )
  4. > self::$_instance = new self();
  5. }
  6. return self::$_instance;
  7. }
複製程式碼

複製程式碼

二、為什麼要使用php設計模式之單例模式? 1、PHP缺點: PHP語言是一種解釋型的腳本語言,這種運作機制使得每個PHP頁面被解釋執行後,所有的相關資源都會被回收。也就是說,PHP在語言層級上沒有辦法讓某個物件常駐內存,這和asp.net、Java等編譯型是不同的,例如在Java中單例會一直存在於整個應用程式的生命週期裡,變數是跨頁面層級的,真正可以做到這個實例在應用程式生命週期中的唯一性。然而在PHP中,所有的變數無論是全域變數或類別的靜態成員,都是頁面層級的,每次頁面被執行時,都會重新建立新的對象,都會在頁面執行完畢後被清空,這樣似乎PHP單例模式就沒有什麼意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現多個應用場景並需要共享同一對象資源時是非常有意義的。

2、單例模式在PHP的應用場合: 1)、應用程式與資料庫交互 一個應用程式會存在大量的資料庫操作,例如過資料庫句柄來連接資料庫這個行為,使用單例模式可以避免大量的new操作,因為每一次new操作都會消耗記憶體資源和系統資源。 2)、控製配置訊息 如果系統中需要有一個類別來全域控制某些配置資訊, 那麼使用單例模式可以很方便的實現.

三、如何實現單例模式?
  1. 1、普通的資料庫存取範例:
  2. ......
  3. //初始化一個資料庫句柄
  4. $db = new DB(.. .);
  5. //新增使用者資訊
  6. $db->addUserInfo(...);
  7. ......
  8. //在函數中存取資料庫,尋找使用者資訊
  9. function getUserInfo()
{
$db = new DB(...);//再次new 資料庫類,和資料庫建立連線 $db = query (....);//根據查詢語句存取資料庫 }
?>

複製程式碼
  1. 2、套用單例模式對資料庫進行操作:
  2. class DB
  3. {
  4. private $_db;
  5. private static $ > private function __construct(...)
  6. {
  7. $this->_db = pg_connect(...);//postgrsql
  8. }
  9. private function __clone() {}; //覆蓋__clone()方法,禁止克隆
  10. public static function getInstance()
  11. {
  12. if(! (self::$_instance instanceof self) ) {
  13. self:: $_instance = new self();
  14. }
  15. return self::$_instance;
  16. }
  17. public function addUserInfo(...)
  18. {
  19. }
  20. public function getUserInfo(...)
  21. {
  22. }
  23. }
  24. //test
$db = DB::getInstance();
$db-> addUserInfo(...); $db->getUserInfo(...); ?>
複製程式碼

3、深入理解

  1. /**
  2. 資料庫操作類別
  3. @link http://bbs.it-home.org
  4. */
  5. class db {
  6. public $conn;
  7. 公有靜態$sql;
  8. public static $instance=null;
  9. 初始化函數 __construct(){
  10. require_once('db.config.php');
  11. $this->conn = mysql_connect($db['主機'],$db['用戶'],$db['密碼']);
  12. if(!mysql_select_db($db['database'],$this->conn)){
  13. echo "失敗";
  14. };
  15. mysql_query('設定名稱 utf8',$this->conn);
  16. }
  17. public static function getInstance(){
  18. if(is_null(self::$instance)){
  19. self::$instance = new db;
  20. }
  21. 回傳 self::$instance;
  22. }
  23. /**
  24. * 查詢資料庫
  25. */
  26. public function select($table,$condition=array(),$field = array()){
  27. $where='';
  28. if(!emptyempty($condition)){
  29. foreach($condition as $k=>$v){
  30. $where.=$k."='".$v 。 「'和」;
  31. }
  32. $where='where '.$where .'1=1';
  33. }
  34. $fieldstr = '';
  35. if(!emptyempty($field)){
  36. foreach($field as $k=>$v){
  37. $fieldstr.= $v.',';
  38. }
  39. $fieldstr = rtrim($fieldstr,',');
  40. }else{
  41. $fieldstr = '*';
  42. }
  43. self::$sql = "從 {$table} {$where} 選取 {$fieldstr}";
  44. $result=mysql_query(self::$sql,$this->conn);
  45. $resuleRow = array();
  46. $i = 0;
  47. while($row=mysql_fetch_assoc($result)){
  48. foreach($row as $k=>$v){
  49. $resuleRow[$i][$k] = $v;
  50. }
  51. $i++;
  52. }
  53. 回傳 $resuleRow;
  54. }
  55. /**
  56. * 新增一筆記錄
  57. */
  58. public function insert($table,$data){
  59. $values = '';
  60. $datas = '';
  61. foreach($data as $k=>$v){
  62. $values.=$k.',';
  63. $datas.="'$v'".',';
  64. }
  65. $values = rtrim($values,',');
  66. $datas = rtrim($datas,',');
  67. self::$sql = "INSERT INTO {$table} ({$values}) VALUES ({$datas})";
  68. if(mysql_query(self::$sql)){
  69. return mysql_insert_id();
  70. }else{
  71. 回傳 false;
  72. };
  73. }
  74. /**
  75. * 修改一筆記錄
  76. */
  77. public function update($table,$data,$condition=array()){
  78. $where='';
  79. if(!emptyempty($condition)){
  80. foreach($condition as $k=>$v){
  81. $where.=$k."='".$v 。 「'和」;
  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 = "更新{$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. foreach($condition as $k=>$v){
  102. $where.=$k."= '".$v .“' 和”;
  103. }
  104. $where='where '.$where .'1=1';
  105. }
  106. self::$sql = "從 { $table} {$where} 刪除";
  107. return mysql_query(self::$sql);
  108. }
  109. public static function getLastSql(){
  110. echoself:: $sql;
  111. }
  112. }
  113. $db = db::getInstance();
  114. //$list = $db->select('demo',array('name'=>'tom','password'=>'ds'),array('name','password ')) ;
  115. //echo $db->insert('demo',array('name'=>'最近你啦','password'=>'123'));
  116. //echo $db- >update('demo',array("name"=>'xxx',"password"=>'123'),array('id'=>1) );
  117. echo $db->delete(' demo',array('id'=>'2'));
  118. db::getLastSql();
  119. echo "
    "? >
    登入後複製

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!