2012-03-28 13 views
1

我想知道如何將self ::和$ this組合成一個「靜態」類?如何使用自我和靜態類相結合?

<?php 
class Test 
{ 
    static private $inIndex = 0; 

    static public function getIndexPlusOne() 
    { 
     // Can I use $this-> here? 
     $this->raiseIndexWithOne(); 

     return self::inIndex 
    } 

    private function raiseIndexWithOne() 
    { 
     // Can I use self:: here? 
     self::inIndex++; 
    } 
} 

echo Test::getIndexPlusOne(); 

?>

我說上面以及代碼中的問題,但我可以用自己::在非靜態方法,我可以在靜態方法中使用$這 - >到調用一個非靜態函數?

謝謝!

回答

2

您可以在非靜態方法中使用self,但在static方法中不能使用$this

self始終指的是類,它在類或對象上下文中是相同的。
$this需要一個實例。

訪問靜態屬性的語法是self::$inIndex BTW(需要$)。

0

你不行。靜態方法無法與需要該類實例的方法或屬性(即非靜態屬性/方法)進行通信。

也許您在查找singleton pattern

+0

值得一提的,你不能使用$這是一個靜態方法裏面:單是時下視爲反模式。 – KingCrunch 2012-03-28 11:20:54

+0

我仍然懷疑這個事實,如果我應該爲我的數據庫類使用單例模式或靜態類。 Singleton看起來更好,但你可以只有1.事實上,將來我將不得不遷移我的數據庫我想有2個實例,然後靜態類會更好。 接下來,如果我看到偉大的WWW上的基準,靜態類更快,然後是單例模式。 – pascalvgemert 2012-03-28 11:36:41

+0

@pascalvgemert - 如果你想要多個實例,你想用靜態方法和屬性來實現什麼?這些是「每類」而不是「每個實例」。 – 2012-03-28 11:58:28

0

您可以在非靜態方法中使用self::$inIndex,因爲您可以從非靜態方法訪問靜態事物。

您不能在靜態方法中使用$this->inIndex,因爲靜態方法沒有綁定到類的實例 - 因此$ this沒有在靜態方法中定義。如果它們是靜態的,那麼只能從靜態方法訪問方法和屬性。

0

這會工作(http://codepad.org/99lorvq1

<?php 
class Test 
{ 
    static private $inIndex = 0; 

    static public function getIndexPlusOne() 
    { 
     // Can I use $this-> here? 
     self::raiseIndexWithOne(); 

     return self::$inIndex; 
    } 

    private function raiseIndexWithOne() 
    { 
     // Can I use self:: here? 
     self::$inIndex++; 
    } 
} 

echo Test::getIndexPlusOne(); 

,因爲沒有實例

+0

謝謝,只是想我需要! – pascalvgemert 2012-03-28 11:32:56