2017-01-21 40 views
0

我只是偶然發現了一個PHP類,並想知道是否有寫它的一個方法的有效理由。PHP類的靜態屬性保持價值,直到下次使用?

LogUtility::getLogger()在PHP應用程序的各種其他PHP類中被稱爲靜態方法。使用的if聲明是否有意義,或者是$logManager總是null當調用getLogger()

class LogUtility 
{ 
    /** 
    * @var LogManager 
    */ 
    protected static $logManager; 

    /** 
    * @return Logger 
    */ 
    public static function getLogger($name) 
    { 
     if (!self::$logManager) { 
      self::$logManager = GeneralUtility::makeInstance(LogManager::class); 
     } 
     return self::$logManager->getLogger($name); 
    } 
} 
+0

寫一個小測試。可以?或者不是嗎? –

回答

0

你可以迅速掀起了一個測試,像下面,和測試/你自己證明這一點:

class someClass { 
    protected static $stored; 

    public static function test() { 
     echo '<br>Stored state:' . self::$stored; 
     if (! self::$stored) { 
      self::$stored = "set"; 
     } 
    } 
} 

someClass::test(); 
someClass::test(); 

輸出是:

存儲的狀態:
存儲的狀態:集

因此,基於這個簡單的測試, swer是是的if聲明是有意義的。靜態變量被設置和維護。

0

$logManager被設置爲該類的一個屬性,所以現在,它幾乎是一個空類,只是返回一個getter實例。這只是將代碼設置爲重用的對象。所以有點回收代碼那裏。

在課堂中,您現在可以隨意使用此對象。因此,如果您通過將另一段代碼設置爲var來運行此LogUtility,則您已經實例化了它。例如$util = new LogUtility();現在如果有人出現並嘗試再次實例化它,$anotherUtil=new LogUtility();這將回收該類,並將實例化的實例傳回,而不是實例化一個新實例。

因此,,它保留它。雖然var不包含每個說法中的「相同值」,但它包含對使用其他變量實例化的「相同」類的引用,因此它最終會在其中存在相同實例的副本。