1. 程式人生 > >PHP單例模式簡記

PHP單例模式簡記

結果 隱私 php單例模式 tin ont st2 受保護 src 如何實現

單例模式只能實例化一次即為單例模式

如何實現只能實例化一次:突破口在於類的構造函數,我們把構造方法變為隱私或者受保護的方法,然後執行代碼

<?php 

 Class Temp {
     protected function __construct () {

     }
 }

 $test = new Temp();

上面的代碼執行會有如下報錯

技術分享圖片

這樣的話就不能實例化了,別人也不能隨便的實例化它,但是我們自己應該如何實例化它呢?進一步修改代碼

<?php 

 Class Temp {
     protected function __construct () {

     }

     
public static function getInstance () { $test = new Temp(); return $test; } } // $test = new Temp(); $test = Temp::getInstance(); var_dump($test);

運行代碼,便可以得到一個對象

技術分享圖片

這說明我們已經成功的實例化了這個類,這說明我們成功的實例化了這個類。

但是這並沒有達到我們要的目的,修改代碼如下

<?php 

 Class Temp {
     protected function __construct () {

     }

     
public static function getInstance () { $test = new Temp(); return $test; } } // $test = new Temp(); $test1 = Temp::getInstance(); $test2 = Temp::getInstance(); $test3 = Temp::getInstance(); if ($test1 === $test2) { echo 同一個; } else { echo 不是同一個; }

執行代碼

技術分享圖片

等到else的結果,這證明這是兩個不一樣的實例,也就是說我們並沒有實現單例,繼續修改代碼如下

<?php 

 Class Temp {
     protected function __construct () {

     }

     public static function getInstance () {
         static $test;
         if (empty($test)) {
             $test = new Temp();
         }
         return $test;
     }
 }

 // $test = new Temp();
 $test1 = Temp::getInstance();
 $test2 = Temp::getInstance();
 $test3 = Temp::getInstance();

 if ($test1 === $test2) {
     echo 同一個;
 } else {
     echo 不是同一個;
 }

運行代碼

技術分享圖片

這次獲得的結果為條件成立的結果,證明這兩個實例其實是同一個實例,到此我們便實現了我們的目的,這個類只會被實例化一次,此即為單例模式。

PHP單例模式簡記