看懂php單例模式-清晰簡潔的回答

來源:互聯網
上載者:User

標籤:empty   資訊   執行個體化   實現   stat   cte   nbsp   highlight   var_dump   

1:

其實單例模式,說白了就是說一個類只能執行個體化一次。但是我們如何在這個執行個體化一次上面做文章呢。其實有個突破口就是__construct()這個魔術方法。這個方法就代表著如果類執行個體化的時候,就會自動執行這個方法。然後如果我把這個方法變成保護或者私人的,會是什麼效果呢。
<?phpclass test{protected function __construct(){}}$test = new test();?>

然後執行以下,就會出現這個情況。

這樣的話,就不能執行個體化了。這樣就保證不能隨便讓人給執行個體化了。
但是既然這樣的話,我們應該怎麼實現執行個體化呢。就是這樣:
<?phpclass test{protected function __construct(){}public static function getInstance(){$_test = new test();return $_test;}}$test = test::getInstance();var_dump($test);?>
這樣的話。執行個體的話,就能出現了。我們看一下:
但是說了這麼多,我還是沒說到重點。下面重點來了,只要我們再使用一個關鍵字(static)就好了。鐺鐺鐺鐺:
<?phpclass test{protected function __construct(){}public static function getInstance(){static $_test;if (empty($_test)) {$_test = new test();}return $_test;}}$test1 = test::getInstance();$test2 = test::getInstance();$test3 = test::getInstance();var_dump($test1,$test2,$test3);echo $test1 == $test2 ? ‘true‘ : ‘false‘;echo "<br>";echo $test2 == $test3 ? ‘true‘ : ‘false‘;echo "<br>";echo $test1 == $test3 ? ‘true‘ : ‘false‘;?>
看一下結果:
這樣的話就能實現php單例的效果了。
單例的話,最長用在需要只使用這一個類,而不是會有多個類。
打個比方。比如現在有個config類,這個類主要是儲存這個項目的配置資訊。如果說這個類能執行個體化多次的話,那麼如果在代碼運行中對配置進行了修改,那麼你怎麼知道是在哪個配置類中進行了修改了呢。這個時候的話使用單例模式,就避免了情況的發生,所有對於設定檔的改變都是基於這個類的執行個體進行修改的。而不會出現因為多個類的執行個體化,操作對於操作的改變沒有進行即時的更新。而且,執行個體多個類庫,佔用記憶體也會非常的厲害,這樣只執行個體化一次。是不是好處多多呢。鮑國梟
連結:https://www.zhihu.com/question/35285158/answer/62151947
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。2:來,帶你裝B帶你飛;
/*單例設計模式 (單態)    定義: 一個類 只能允許有 一個對象存在.    1.不讓進: 使類不能被執行個體化    2.留後門: 設定靜態方法    3.給對象: 在靜態方法裡執行個體化該類    4.判初夜: 判斷是否是 第一次產生該類的對象    5.設靜態: 靜態方法裡 要使用靜態屬性 *//*//1.不讓進: 使類不能被執行個體化-----------------class Test{    // 設定 一個封裝的構造方法    private function __construct()    {        //佔位, 我就是不讓你NEW我~~~    }}*//*//2.留後門: 設定靜態方法--------------------class Test{    // 設定 一個封裝的構造方法    private function __construct()    {        //佔位, 我就是不讓你NEW我~~~    }    //後門    public static function getObject()    {        echo "啊,我是後門,進吧!<br>";    }}*//*//3.給對象: 在靜態方法裡執行個體化該類------------------class Test{    // 設定 一個封裝的構造方法    private function __construct()    {        //佔位, 我就是不讓你NEW我~~~    }    //後門    public static function getObject()    {        echo "啊,我是後門,進吧!<br>";        return new self();//執行個體化一個對象給你    }}*//*//4.判初夜: 判斷是否是 第一次產生該類的對象------------------class Test{    private $obj = null;//屬性值為對象,預設為null    // 設定 一個封裝的構造方法    private function __construct()    {        //佔位, 我就是不讓你NEW我~~~    }    //後門    public static function getObject()    {        echo "啊,我是後門,進吧!<br>";        if ($this->obj === null) {            $this->obj = new self();//執行個體化一個對象        }        //返回的屬性 其實就是本對象        return $this->obj;    }}*///5.設靜態: 靜態方法裡 要使用靜態屬性------------------class Test{    private static $obj = null;//屬性值為對象,預設為null    // 設定 一個封裝的構造方法    private function __construct()    {        //佔位, 我就是不讓你NEW我~~~    }    //後門    public static function getObject()    {        echo "啊,我是後門,進吧!<br>";        if (self::$obj === null) {            self::$obj = new self();//執行個體化一個對象        }        //返回的屬性 其實就是本對象        return self::$obj;    }}/*Test::getObject();//使用靜態方法訪問該類裡的方法exit;*/$t1 = Test::getObject();$t2 = Test::getObject();$t3 = Test::getObject();$t4 = Test::getObject();$t5 = Test::getObject();$t6 = Test::getObject();$t7 = Test::getObject();$t8 = Test::getObject();//判斷 兩個對象 是否是同一個對象if ($t1 === $t6) {    echo "哦, Yes! 是同一個執行個體<br>";} else {    echo "哦, No! 不是同一個執行個體<br>";}
第五步是成品,前面4步都是一步一步的推的!獨身待蒼顏
連結:https://www.zhihu.com/question/35285158/answer/141024074
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

 

看懂php單例模式-清晰簡潔的回答

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.