2013-11-24 131 views
1

我寫了一個小測試場景,用於測試混合使用靜態和非靜態方法。 將公共方法作爲靜態方法調用時,會生成嚴格的警告。 這讓我想,也許調用靜態方法作爲公共方法會產生類似的警告,但它沒有。靜態方法可以作爲公共方法調用嗎?

可以將靜態方法作爲非靜態方法調用嗎?這樣做會有什麼後果嗎?

<?php 
class TestS { 
    static function _testS() { 
    echo("Hello Static<br>\n"); 
    // Strict warning: Non-static method TestS::_tS() should not be 
    // called statically in TestS::_tS() 
    self::_tS(); 
    } 
    public function _tS() { 
    echo("tS<br>\n"); 
    } 
    public function _testP() { 
    echo("Hello Public<br>\n"); 
    self::_tP(); 
    } 
    static function _tP() { 
    echo("tP<br>\n"); 
    } 
    public function _testSP() { 
    $this->_tP(); 
    } 
} 

$test = new TestS(); 
echo("///////////<br>\n"); 
$test->_testP(); 
echo("///////////<br>\n"); 
TestS::_testS(); 
echo("///////////<br>\n"); 
$test->_testSP(); 
echo("///////////<br>\n"); 
+0

請不要使用靜態方法。 –

+0

除了首選項之外,是否有任何強制性的參數不使用靜態方法? 我喜歡使用靜態方法/類來保持全局範圍清理大量小型實用功能。 – forsvunnet

+0

靜態方法和變量**的問題是**它們是全局的。 –

回答

1

它是確定調用靜態方法作爲公共方法?

理論上是這樣。這是因爲靜態方法在任何地方都不會引用$this,因此它在靜態或實例方法中調用時都可以工作。

這樣做會有什麼後果嗎?

這是一個很好的做法,明確指出你打電話給什麼樣的方法;當回顧你的代碼時,你會清楚地知道哪個方法是靜態的,因爲你調用它的方式,除了在實例方法中使用parent::method()這個明顯的例外。

避免首先使用靜態方法也是一種很好的做法;如果你有很多,它通常表示代碼的氣味,應該重構。

相關問題