2013-10-07 24 views
0

我正在用PHP學習OOP。我對使用static方法和屬性感到困惑。是否有必要在這個類中使用靜態方法和屬性?

在這個例子中,我將使用服務器端的一個小緩存示例。但我不確定使用靜態方法和屬性。

class Villa extends CI_Model 
{ 
    // Cache 
    protected $cacheOwner; 

    ... 

    public function owner() 
    { 
    if (! empty($this->cacheOwner)) 
     return $this->cacheOwner; 

我認爲它會工作,但使用「靜態」更好?或者我只有在繼承父類的屬性或方法時才必須使用「靜態」?

+4

此問題似乎是無關緊要的,因爲答案似乎主要是基於意見的 –

+0

您是否瞭解靜態和非靜態屬性和方法之間的區別是什麼? – deceze

+0

'我認爲它會工作,但使用「靜態」更好?'那麼爲什麼更好? – Touch

回答

1

我正在學PHP的OOP。我對使用靜態方法 和屬性感到困惑。

在這個例子中,我將使用服務器端的一個小緩存示例。但 我不知道用靜態方法和屬性

那麼,如何創建和使用靜態方法/屬性:

class Villa extends CI_Model 
{ 
    protected static $cacheOwner = null; 

    public static function owner() 
    { 
     if (! is_null(static::$cacheOwner)) { 
      return static::$cacheOwner; 
     } 
    } 
} 

使用它作爲

Villa::owner(); 

我認爲它會工作,但使用「靜態」更好?或者我必須僅在從父類繼承屬性或方法時才使用「靜態」 ?

不,它根本就不對,因爲靜態考慮了harmfulanti-pattern。在術語object oriented programming中,其中Objects封裝了狀態並提供了轉換此狀態的方法,但是當您使用static屬性和方法時,它違反了原則,因爲它(靜態)在所有實例化對象上保留相同的狀態,因此它是class oriented programming而不是OOP。在OOP中,類只是藍圖/數據類型,而對象則是要玩的東西。靜態方法/類也不便於單元測試,因爲依賴性很強,也很難擴展。在一些像singleton design pattern這樣的情況下,靜態類方法/屬性可能是有用的,但它(單例)本身被認爲是糟糕的設計模式,並且在OOP之外。檢查SOLID和(另見)部分中提供的其他鏈接。

因此,儘量避免使用static,最後,沒有人能告訴你實際上你需要在你的班級中,但你,因爲你知道你要做什麼,你的班級如何與你的應用程序相關,如果你需要保持一個屬性/數據的狀態一直到你的應用程序的生命週期,那麼你可以使用它,但不確定。另外,檢查this search result並閱讀一些很好的答案,你會從這裏學到很多東西,至少我做了很多,我發現this article有一些例子,可能也有幫助。

0

一般來說,如果方法不使用局部給定方法的實例化對象的變量,則會使用靜態方法。

相關問題