PHP設計模式 單例模式

2021-09-11 06:29:39 字數 4191 閱讀 9874

一直以來都是在寫專案卻從來沒有仔細分析過什麼是單例模式,單例模式分為幾種,單例模式有什麼特點。今天隨便記錄乙個隨筆,全當是複習複習做個筆記。

單例模式要確保某個類只有乙個例項,而且自動例項化並向整個系統提供例項。單例模式分為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.作用 避免重複例項化,節省系統資源。例如在資料庫操作方面,會大量存在資料庫連線操作,單例類可以避免多次...