php設計模式之單例模式

1. 單例模式含義

單例模式就是一個類只有一個實例,不能外部實例化壳猜,并向整個系統(tǒng)全局地提供這個實例。它不會創(chuàng)建實例副本滑凉,而是會向單例類內(nèi)部存儲的實例返回一個引用统扳。

2. 為何要使用PHP單例模式?

PHP每次執(zhí)行完,返回數(shù)據(jù)后,會從內(nèi)存中清理掉所有的資源. 所以PHP中的單例模式實際每次運行都是需重新實例化, php單例模式適合使用在整個運行過程中需要多次對某一操作類進行多次new的場景畅姊。

代碼塊在內(nèi)存的分布

注: 每實例化一次就會在堆內(nèi)存中復制一份代碼段

<?php
    class {
        function __consruct(){
        }
    }
    $Aobj = new A();
    $Bobj = new A();
    if($Aobj === $Bobj){
        echo '對象相等','<br>';
    }else{
        echo '對象不相等','<br>';
    }
    echo '<pre>';
    var_dump($Aobj);
    var_dump($Bobj);

打印如下輸出


打印

3. 創(chuàng)建一個PHP單例其實只需要掌握以下四點:

  1. 定義靜態(tài)變量咒钟,存放該類實例化的唯一對象
  2. 定義私有構(gòu)造方法,防止類外部new創(chuàng)建對象
  3. 定義公共的靜態(tài)方法來獲取該對象,供類外部使用
  4. 定義個私有的克隆方法若未,禁止該對象被克隆

注: php的static變量只針對一次請求朱嘴,php文件執(zhí)行完畢,該static變量也隨機消亡粗合,再次請求(再次執(zhí)行該php文件)萍嬉,會重新創(chuàng)建該static變量。

4. 單例模式使用場景:

  1. 數(shù)據(jù)庫應用, 一個應用中會頻繁進行數(shù)據(jù)庫操作, 如使用單例模式, 則可以避免大量的new 操作,避免過多的消耗系統(tǒng)資源隙疚。
  2. 配置資源的共享壤追,用單例模式也可以減少每次去讀取配置帶來的內(nèi)存和系統(tǒng)資源的消耗
  3. 可以在單例模式類中,集中處理,設置鉤子,日志輸出等提高代碼可維護性

5. 使用示例

5.1. redis使用示例

<?php 
class RedisModel{
    # 私有靜態(tài) 變量存儲被實例化的對象
    private static $obj=null; 
    #禁止外部實例化
    private  function __construct(){
        self::$obj = new \Redis();
        self::$obj->connect('127.0.0.1','6379');
    }
    #外部調(diào)用創(chuàng)建該類的實例
    public static function create(){
        if(self::$obj === null) new RedisModel();
        return self::$obj;
    }
    # 禁止克隆該對象
    private function __clone(){}
}
$redisModelA = RedisModel::create();
$redisModelB = RedisModel::create();
if($redisModelB ===$redisModelA){
    echo '相等','<br>';
}else{
    echo '不相等','<br>';
}
$redisModelB->set('name','張三');
echo $redisModelB->get('name');

# 2. 報錯說明已經(jīng)禁止外部實例
$redisModelC = new RedisModel();
var_dump($redisModelC);
運行打印
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市供屉,隨后出現(xiàn)的幾起案子行冰,更是在濱河造成了極大的恐慌,老刑警劉巖伶丐,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悼做,死亡現(xiàn)場離奇詭異,居然都是意外死亡撵割,警方通過查閱死者的電腦和手機贿堰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啡彬,“玉大人羹与,你說我怎么就攤上這事∈樱” “怎么了纵搁?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長往踢。 經(jīng)常有香客問我腾誉,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任利职,我火速辦了婚禮趣效,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猪贪。我一直安慰自己跷敬,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布热押。 她就那樣靜靜地躺著西傀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桶癣。 梳的紋絲不亂的頭發(fā)上拥褂,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音牙寞,去河邊找鬼饺鹃。 笑死,一個胖子當著我的面吹牛碎税,可吹牛的內(nèi)容都是我干的尤慰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雷蹂,長吁一口氣:“原來是場噩夢啊……” “哼伟端!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匪煌,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤责蝠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后萎庭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霜医,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年驳规,在試婚紗的時候發(fā)現(xiàn)自己被綠了肴敛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吗购,死狀恐怖医男,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捻勉,我是刑警寧澤镀梭,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站踱启,受9級特大地震影響报账,放射性物質(zhì)發(fā)生泄漏研底。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一透罢、第九天 我趴在偏房一處隱蔽的房頂上張望榜晦。 院中可真熱鬧,春花似錦琐凭、人聲如沸芽隆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牙躺,卻和暖如春愁憔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孽拷。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工吨掌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脓恕。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓膜宋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炼幔。 傳聞我的和親對象是個殘疾皇子秋茫,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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

  • JSP & EL & JSTL (一)JSP的回顧 一、什么是JSP JSP:JavaServerPages(...
    李玉賢_8e75閱讀 219評論 0 0
  • 【08/02/2017枢贿,愛非堅持,瑩子親子記錄194篇】 媽媽今日起床時間:5:10 今日小確幸:天氣確確實實涼快...
    瑩子悅讀書香閱讀 262評論 0 0
  • 現(xiàn)在是2019.年刀脏,8月16日局荚, 這是一個很奇怪的社會現(xiàn)象,婚姻切戀愛從來都是社會發(fā)展的結(jié)果愈污,那么很多的男生和女生...
    又新生閱讀 661評論 1 1
  • 今天上午聽林先生講《如何經(jīng)營好宅家時光》耀态,下午聽舜天先生講《中小微企業(yè)如何應對疫情帶來的“危”與“機”》钙畔。收獲多多...
    Candy428閱讀 282評論 0 0