2014-06-16 49 views
0

PHP允許使用的靜態成員函數和變量,因爲5.3包括延遲靜態綁定:在PHP中使用靜態成員是否有最佳做法?

class StaticClass { 
    public static $staticVar; 

    ... 
} 

$o = new StaticClass(); 

目前,有訪問這些靜態成員的各種選項:

$o->staticVar; // as instance variable/ function 
$o::staticVar; // as class variable/ function 

其他選項用於訪問存在來自課堂的成員:

self::$staticVar; // explicitly showing static usage of variable/ function 
static::$staticVar; // allowing late static binding 

重構某些使某些靜態成員使用的現有類我問自己是否有在PHP中使用靜態成員的最佳實踐?

+0

不要使用'$ o-> staticVar;'來訪問靜態屬性,因爲它最近會發出警告;使用類外的'StaticClass :: staticVar;' –

回答

1

很明顯,他們都做不同的事情。

$o->staticVar 

這是無效,因爲你不能/不應該與實例屬性語法訪問靜態性能。

StaticClass::$staticVar 

這非常明顯地訪問一個特定類的特定靜態變量。

$o::$staticVar 

此訪問的類中的靜態變量$o是的一個實例。它主要用作以前方法的縮寫,在所有方面都相當。很顯然,使用哪個類完全取決於什麼類$o是一個實例。

self::$staticVar 

這隻能在類內使用,並始終指的是它是寫在類,它是使用這個類而不是StaticClass::$staticVar內一個好主意,如果類是指本身,因爲你如果稍後更改類名,則不需要擔心任何事情。例如: -

class Foo { 

    protected static $bar = 42; 

    public function baz() { 
     self::$bar; // good 
     Foo::$bar // the same, but should be avoided because it repeats the class name 
    } 

} 
static::$staticVar 

這也只是一個類的內部使用,基本上與上述相同self,但後期靜態綁定解決,並可能因此指子類。

「最佳實踐」是什麼是值得商榷的。我會說你應該永遠具有必要的特殊性,但不要多說。 $o::$staticVarstatic::$staticVar都允許班級通過兒童班級變化,而self::$staticVarStaticClass::$staticVar不允許。在open/closed principle之後,最好使用前一種更可變的方法來允許擴展。

屬性,包括靜態和非靜態,也不應該是public不破壞封裝。請參閱How Not To Kill Your Testability Using Statics

+0

至少這在PHP中是不允許的,儘管它應該調用成員變量的靜態方法:$ this-> interpreter :: staticMethod() – andig

0

首先,不要使用$ this-> staticVar。我不確定這種情況何時發生變化(我相信PHP 5.4),但在最近的版本中,不再可能以這種方式檢索靜態變量。

至於使用晚期靜態綁定,如果你不需要它,不要使用它。使用它的原因是,如果您計劃使用繼承並期望在派生類中更改靜態變量的值。

相關問題