一直以來都是在寫專案卻從來沒有仔細分析過什麼是單例模式,單例模式分為幾種,單例模式有什麼特點。今天隨便記錄乙個隨筆,全當是複習複習做個筆記。
單例模式要確保某個類只有乙個例項,而且自動例項化並向整個系統提供例項。單例模式分為3種:餓漢單例模式、懶漢單例模式、登記式單例模式。
單例模式有3個特點:
只有乙個例項
必須自行建立這個例項
必須給其他物件提供這個例項
試用領取有人能領到180天。
阿里雲領取優惠券位址
單例模式常被應用到資料庫連線,這種耗費資源的操作。類的結構分為3私1公/4私1公。下面就編寫乙個簡單的單例模式:
1 <?php
2 3 class db
17 18 /**
19 * 私有轉殖方法
20 * 防止多個例項
21 */
22 private function __clone()
25 26 /**
27 * 防止反序列化
28 */
29 private function __wakeup()
32 33 /**
34 * 公有靜態方法
35 * 判斷$instance是否例項化,存在例項化物件就直接返回,不存在例項化物件就new例項化
36 */
37 public static function getinstance()
41 return self::$instance;
42 }
43 }
44 45 $db = db::getinstance();
46 var_dump($db);
47 $db = db::getinstance();
48 var_dump($db);
執行結果:
可以看到兩次執行的控制代碼都一樣是同乙個例項。接下來把這個單例完善一下變成乙個資料庫連線的單例模式:
1 <?php
2 3 class db
32 //建立資料庫連線
33 $this->link = mysqli_connect($this->config['host'], $this->config['username'], $this->config['password'], $this->config['databases'], $this->config['port']);
34 35 //輸出連線錯誤
36 $this->connect_errno();
37 38 if($this->config['databases']) '");
41 }
42
43 return $this->link;
44 }
45 46 /**
47 * 私有轉殖方法
48 * 防止多個例項
49 */
50 private function __clone()
53 54 /**
55 * 防止反序列化
56 */
57 private function __wakeup()
60 61 /**
62 * 公有靜態方法
63 * 判斷$instance是否例項化,存在例項化物件就直接返回,不存在例項化物件就new例項化
64 * array $config 資料庫配置
65 */
66 public static function getinstance($config)
72 //返回$instance例項化物件
73 return self::$instance;
74 }
75 76 /**
77 * 執行sql
78 * $query sql語句
79 */
80 public function query($query)
84 85 /**
86 * 選擇資料庫
87 * string $dbname 資料庫名稱
88 */
89 public function select_db($dbname) '");
93 return $this->result;
94 }
95 96 /**
97 * 查詢一條或多條資料
98 * string $sql sql語句
99 * mysqli_num、mysqli_assoc、mysqli_both
100 */
101 public function fetch_array($sql, $type = mysqli_both)
108 } else
111 return $this->rows;
112 }
113
114 public function num_rows($result)
118
119 /**
120 * 輸出連線錯誤
121 */
122 private function connect_errno()
126 }
127
128 /**
129 * 關閉資料庫連線
130 */
131 public function close()
135
136
137 }
138
139 $config = [
140 'host' => '172.17.0.2',
141 'username' => 'root',
142 'password' => 'cuiyuanxin66666',
143 // 'databases' => 'nndb'
144 ];
145 $db = db::getinstance($config);
146 $db1 = db::getinstance($config);
147 //判斷兩個例項物件是否一致
148 if($db === $db1) else
155 //切換資料庫hkxy
156 $db->select_db('hkxy');
157 $sql = 'select * from qii_admin_menu limit 1';
158 $rows = $db->fetch_array($sql, mysqli_assoc);
159 var_dump($db);
160 echo '
-----------------------------------------
';161 var_dump($rows);
162 echo '
-----------------------------------------
';163 $db->select_db('nndb');
164 $sql = 'select * from niuniu_user limit 1';
165 $rows = $db->fetch_array($sql, mysqli_assoc);
166 var_dump($rows);
經過改造乙個連線資料庫的單例模式就寫完了,看一下執行結果:
通過**來看兩個例項物件完全一樣
php設計模式 單例模式
靜態方法所訪問的屬性也必須是static的。靜態方法呼叫靜態變數使用方式是self 靜態變數名 靜態方法呼叫靜態方法使用方式是self 靜態方法名 類的例項可以訪問靜態方法,但不可以訪問靜態變數 package name subpackage name category name author ad...
PHP設計模式 單例模式
單例模式就是保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。通常我們可以讓乙個全域性變數使得乙個物件被訪問,但是不能防止你例項化多個變數,乙個最好的辦法就是讓類自身負責儲存它的唯一例項,這個類可以保證沒有其它例項可被建立,並且他可以提供乙個訪問該例項的方法。下面提供兩種單例模式的例子 例1 ...
PHP設計模式 單例模式
單例模式的必要性 1.目的 確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。2.要點 1 某乙個類只能有乙個例項 2 必須自行建立這個例項 3 必須自行向整個系統提供這個例項。3.作用 避免重複例項化,節省系統資源。例如在資料庫操作方面,會大量存在資料庫連線操作,單例類可以避免多次...