2016-09-06 163 views
1

我想解決下例中的私有靜態方法是否應該是非靜態的。它只關心類的靜態屬性,這導致我相信它可以作爲靜態方法。但是,它只能從非靜態方法調用,這表明它也應該是非靜態方法。使用私有靜態方法

我明白公共方法應該是靜態的,而不是私有方法應該是靜態的。

在此先感謝您的建議!

<?php 
class MyClass 
{ 
    private static $initialized = false; 
    private static $staticProperty1; 
    private static $staticProperty2; 
    private  $normalProperty1; 

    public function __construct($normalProperty) 
    { 
     $this->normalProperty1 = $normalProperty; 
    } 

    public function doSomething() 
    { 
     self::initialize(); 
     // Now do some other stuff 
    } 

    private static function initialize() 
    { 
     if (!self::$initialized) { 
      self::$staticProperty1 = 'Hello'; 
      self::$staticProperty2 = 'World'; 
      self::$initialized = true; 
     } 
    } 
} 

回答

1

這是一個有趣的問題。你想知道什麼時候私有函數應該是靜態的。 如果你想從另一個靜態方法調用它,它必須是靜態的。這是因爲您無權訪問 $this

我以前的假設是不正確的。您也可以從靜態函數調用非靜態方法。但是您必須考慮到您無法使用變量$this訪問對象本身。也不可能訪問非靜態對象屬性。

在你的例子中,在我看來,如果你從非靜態的上下文中調用方法,你可以使它不是靜態的。它不需要是靜態的。但我不能告訴你這是否是好的做法。正是我會做的。

+0

好的,謝謝。我理解它最終可能歸結爲個人偏好,但我喜歡儘可能使用我的代碼進行語義化。 –

1

通常當我希望我的公共靜態方法調用另一個方法時,我會執行私有靜態方法。

+0

是的,我會這樣做,但在這種情況下,公共方法不是靜態的。您是否將私有方法更改爲非靜態方法,即使它只設置靜態屬性? –

+1

是的,我會將它更改爲實例方法,因爲它是由另一個實例方法調用的。它也沒有理由是靜態的。另一件事,因爲你的方法現在初始化靜態變量,它會工作,但如果你想初始化非靜態變量,你想分開它嗎? –

+0

好吧有道理。關於將來可能設置非靜態屬性的觀點是考慮它的好方法! –

相關問題