2012-07-10 270 views
1

我最近在處理繼承時遇到了靜態變量/方法的問題。該代碼讀取這樣的:基類和繼承的靜態屬性

<?php 
Class TestBase 
{ 
    public static $values; 

    public static function addValue($value) 
    { 
     static::$values[] = $value; 
    } 
} 

Class TestOne extends TestBase 
{ 

} 
Class TestTwo extends TestBase 
{ 

} 

TestOne::addvalue('one'); 
TestOne::addvalue('two'); 
TestOne::addvalue('three'); 
var_dump(TestOne::$values); 
echo "<br /><br />"; 

TestTwo::addvalue('four'); 
TestTwo::addvalue('five'); 
TestTwo::addvalue('six'); 
var_dump(TestTwo::$values); 
echo "<br /><br />"; 

var_dump(TestOne::$values); 
?> 

這將產生輸出:

陣列(3){[0] =>串(3) 「一」[1] =>串(3 )「two」[2] => string(5) 「three」}

array(6){[0] => string(3)「one」[1] => string(3) (3)=> string(4)「four」[4] => string(4)「five」 [5] => string(3)「 「}

array(6){[0] => string(3)「one」[1] => string(3)「two」[2] => string(5)「three」[3] => string (4) 「四」[4] => 串(4) 「5」[5] =>串(3) 「六」}

正如你可以看到,添加到任任何值相加二者皆是。我的理解是,方法中的靜態::關鍵字綁定到繼承類,而不是父類,所以我認爲這源於這樣一個事實,即只有一個靜態:: $值將被創建,並且都假設我引用了值。這可以通過在每個基類中重新聲明公共靜態$值來解決,但是有沒有更簡單的方法來實現這一點,以便每個類都獲得自己的靜態副本?任何會阻止需要重新聲明每個繼承類的關鍵字或技巧?

回答

0

我想這是源於這樣一個事實,即只有一個靜態:: $值將被創建,並且都假定我引用該值。

正確。

這可以通過重新聲明公共靜態$值在每個從基地擴展的類,但有一個更簡單的方法來做到這一點,使每個獲得自己的靜態副本?任何會阻止需要重新聲明每個繼承類的關鍵字或技巧?

不,沒有這樣的事情。然而,訣竅是儘可能避免靜態的東西。當你遇到類似這樣的情況時,大多數時候這是一個很好的指示器,你的代碼設計需要一些優化。