php單例模式

單例模式確保某個(gè)類只有一個(gè)實(shí)例则酝,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例殉簸。

單例模式是一種常見的設(shè)計(jì)模式闰集,在計(jì)算機(jī)系統(tǒng)中,線程池般卑、緩存武鲁、日志對(duì)象、對(duì)話框蝠检、打印機(jī)沐鼠、數(shù)據(jù)庫操作、顯卡的驅(qū)動(dòng)程序常被設(shè)計(jì)成單例叹谁。
單例模式有以下3個(gè)特點(diǎn):
1.只能有一個(gè)實(shí)例饲梭。
2.必須自行創(chuàng)建這個(gè)實(shí)例。
3.必須給其他對(duì)象提供這一實(shí)例焰檩。


那么為什么要使用PHP單例模式憔涉?
PHP一個(gè)主要應(yīng)用場(chǎng)合就是應(yīng)用程序與數(shù)據(jù)庫打交道的場(chǎng)景,在一個(gè)應(yīng)用中會(huì)存在大量的數(shù)據(jù)庫操作析苫,針對(duì)數(shù)據(jù)庫句柄連接數(shù)據(jù)庫的行為兜叨,使用單例模式可以避免大量的new操作。因?yàn)槊恳淮蝞ew操作都會(huì)消耗系統(tǒng)和內(nèi)存的資源衩侥。


然而国旷,PHP在語言級(jí)別上沒有辦法讓某個(gè)對(duì)象常駐內(nèi)存。在PHP中茫死,所有的變量都是頁面級(jí)的议街,無論是全局變量,不過,在實(shí)際應(yīng)用中同一個(gè)頁面中可能會(huì)存在多個(gè)業(yè)務(wù)邏輯,這時(shí)單例模式就起到了很重要的作用,有效的避免了重復(fù) ,雖然有時(shí)候會(huì)有些雞肋璧榄。
在不使用單例的情況下我們?cè)谝粋€(gè)類里面操作數(shù)據(jù)庫可能是這樣的:

<?php
function updateUserInfo(){
  $db = new DB(...);
  $db->query();
}
function getOneUser($id){
  //多次初始化數(shù)據(jù)庫連接
   $db = new DB(...);
  $user = $db->query($id);
   updateUserInfo($id);
}

顯然連接數(shù)據(jù)庫的操作在連接同一個(gè)數(shù)據(jù)庫的情況下是適用于所有的特漩,所以在這種情況下單例能大大減少不必要的資源消耗,大多數(shù)php框架數(shù)據(jù)庫連接都是采用單例模式骨杂,以下是使用單例的做法:

<?php
class DB{
//私有化的全局實(shí)例
static private $_instance = NULL;
/**
 *  私有化構(gòu)造函數(shù)涂身,防止外界實(shí)例化對(duì)象
*/
private function  __construct() {
        \\連接數(shù)據(jù)庫
}
/**
 *  私有化克隆函數(shù),防止外界克隆對(duì)象
*/
private function  __clone(){}
/**
 *  靜態(tài)方法, 單例統(tǒng)一訪問入口搓蚪,如果存在實(shí)例返回該實(shí)例蛤售,否則創(chuàng)建新實(shí)例
 *  @return  object  返回對(duì)象的唯一實(shí)例
*/
static public function getInstance() {
  if (is_null(self::$_instance) || !isset(self::$_instance)) {
  self::$_instance = new self();
  }
  return self::$_instance;
} 
//測(cè)試單例
public function getName() {
  echo 'hello world!';
}
}

所以總結(jié)如下
1.需要一個(gè)保存類的唯一實(shí)例的靜態(tài)成員變量(通常為$_instance私有變量)
2.構(gòu)造函數(shù)和克隆函數(shù)必須聲明為私有的,這是為了防止外部程序new類從而失去單例模式的意義
3.必須提供一個(gè)訪問這個(gè)實(shí)例的公共的靜態(tài)方法(通常為getInstance方法)妒潭,從而返回唯一實(shí)例的一個(gè)引用


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滓窍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巩那,更是在濱河造成了極大的恐慌吏夯,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件即横,死亡現(xiàn)場(chǎng)離奇詭異噪生,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)东囚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門跺嗽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人页藻,你說我怎么就攤上這事桨嫁。” “怎么了份帐?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵璃吧,是天一觀的道長。 經(jīng)常有香客問我废境,道長畜挨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任噩凹,我火速辦了婚禮巴元,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驮宴。我一直安慰自己逮刨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布幻赚。 她就那樣靜靜地躺著禀忆,像睡著了一般臊旭。 火紅的嫁衣襯著肌膚如雪落恼。 梳的紋絲不亂的頭發(fā)上箩退,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音佳谦,去河邊找鬼戴涝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钻蔑,可吹牛的內(nèi)容都是我干的啥刻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼可帽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了努隙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤舀锨,失蹤者是張志新(化名)和其女友劉穎雁竞,沒想到半個(gè)月后碑诉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體德挣,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屯掖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椎咧。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡地技,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出作谚,到底是詐尸還是另有隱情,我是刑警寧澤双吆,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布眨唬,位于F島的核電站,受9級(jí)特大地震影響好乐,放射性物質(zhì)發(fā)生泄漏匾竿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一蔚万、第九天 我趴在偏房一處隱蔽的房頂上張望岭妖。 院中可真熱鬧,春花似錦、人聲如沸昵慌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斋攀。三九已至已卷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜻韭,已是汗流浹背悼尾。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工柿扣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肖方,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓未状,卻偏偏與公主長得像俯画,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子司草,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理艰垂,服務(wù)發(fā)現(xiàn),斷路器埋虹,智...
    卡卡羅2017閱讀 134,697評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,282評(píng)論 25 707
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡(jiǎn)單猜憎、最易理解的設(shè)計(jì)模式,也因?yàn)樗暮?jiǎn)潔易懂搔课,是項(xiàng)目中最...
    成熱了閱讀 4,255評(píng)論 4 34
  • 清晰地記得那天下午胰柑,空氣干凈又舒服,陽光不刺眼也不溫暖爬泥,卻強(qiáng)烈地妄圖滲進(jìn)窗簾柬讨。語文老師講的高適換起來我的英雄夢(mèng),天...
    孟霓裳閱讀 364評(píng)論 2 7
  • 解決辦法:計(jì)時(shí)結(jié)束置為nil 且 [_timer invalidate]; 頁面消失的時(shí)候用下面的代碼 參考文章
    Torin76閱讀 178評(píng)論 0 0