php設(shè)計模式之單例模式

1. 單例模式含義

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

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

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

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

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

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

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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容