2012-05-24 63 views
4

我學習PHP,OOP和我在靜態, 在這個php.net/static我不明白這句話PHP,OOP,靜態

Calling non-static methods statically generates an E_STRICT level warning. 

我也知道這是由只(不屬性)方法有效上面的句子, ,但我幾乎沒有成功地理解它實際上, 我很高興如果有任何事情可以請給我演示解釋上述句子的代碼, 祝您有愉快的一週。

+1

它告訴你,如果你調用一個非靜態方法而沒有初始化它,我會給出一個E_STRICT警告。你不明白什麼?靜態意味着您可以調用該方法而無需將類初始化爲對象。 –

+1

你應該瞭解的OOP和靜態調用最重要的是他們不混合。靜態調用是程序編程思維的一部分。 –

+0

謝謝大家,我正在閱讀他們的答案。 – Blanktext

回答

4
class Foo 
{ 
    public static $my_static = 'foo'; 
    public $my_non_static = 'bar'; 

    public function staticValue() { 
     return self::$my_static; 
    } 

    public function nonStaticValue() { 
     return self::$my_non_static; 
    } 
} 

print Foo::$my_static . "\n"; // OK 
print Foo::staticValue(). "\n"; // E_STRICT 

print Foo::$my_non_static . "\n"; // Fatal 
print Foo::nonStaticValue(). "\n"; // Fatal 

print Foo::$my_static . "\n";沒問題 - 靜態地訪問靜態屬性。

print Foo::staticValue(). "\n";給出E_STRICT - 靜態訪問非靜態方法,但不是致命錯誤,因爲此方法不訪問非靜態屬性。

另外兩個給出致命錯誤,因爲無法靜態訪問非靜態字段。

+0

當你說非靜態字段時,意思是該值沒有被定義爲靜態字段內的靜態值?而關於E_STRICT它不僅僅是因爲它的訪問非靜態的特性,我可以返回簡單的字符串,我不必自己:$ x_static_prop。 – Blanktext

+0

當我說非靜態字段時,我的意思是屬性,沒有靜態關鍵字定義。對不起,我不明白你的第二句話。 – Ruben

+0

謝謝Ruben,我現在明白你的意思了,關於我的第二句話,我的意思是說我可以做'Hellow';而不是self :: $ static_prop。 – Blanktext

4

下面是他們對您提問的句子的含義的示例。

用一種方法考慮以下類(它不是靜態的)。

class Test 
{ 
    function method() 
    { 
     echo "Hello from method"; 
    } 
} 

Test::method(); // attempt to statically call a non-static method 

這是輸出:

嚴格標準:非靜態方法測試::()的方法不應該是 在/obj.php靜態調用上線12
你好from方法

正如你所看到的那樣,它確實執行該方法時調用靜態即使你這不是一個靜態方法,但是顯示了嚴格的錯誤信息。

如果方法method()引用關鍵字$this,那麼您將遇到致命錯誤,因爲$this不存在於靜態方法調用的上下文中。所以雖然技術上可以靜態地調用非靜態類方法,但不應該這樣做。

編輯:

你甚至被允許調用非靜態類成員靜態的原因是因爲static關鍵字沒有在PHP4中的類方法的情況下存在,因此,如果你在設計一個靜態類或方法在PHP4中,沒有關鍵字來表示它,你可以簡單地以靜態方式調用它。現在,如果靜態調用方法但在聲明中沒有static關鍵字,PHP5將發出警告。

+0

謝謝我閱讀你的解釋真的很好。 – Blanktext

0

如果一個方法是非靜態的,這意味着它屬於一個類的實例。例如,如果我們有一個名爲getDamage()的方法Car(計算汽車損壞程度),那麼您不應該以靜態方式調用此方法。

您應該只創建一個Car類的實例,並在該實例上調用getDamage()。這是有道理的,因爲特定的汽車可能會損壞25%,而另一輛汽車可能會損壞70%。

但以靜態方式調用getDamage()沒有意義:靜態方法不屬於類的特定實例,而是屬於類本身。而Car班沒有有效的方法給getDamage()的結果。你仍然可以計算一個值(可能是0),但它沒有任何意義。

+0

謝謝你的解釋很好的邏輯之一。 – Blanktext

2

這是因爲即使您可以靜態調用非靜態方法,也不應該記錄它。

class Foo { 
    function bar(){ 
     print "you should not do that"; 
    } 
} 

Foo::bar();居然會的工作,但你會得到一個E_STRICT警告,因爲你可以做到這一點,但你shouln't

+0

謝謝你,你的最後一行真的澄清了事情。 – Blanktext