我學習PHP,OOP和我在靜態, 在這個php.net/static我不明白這句話PHP,OOP,靜態
Calling non-static methods statically generates an E_STRICT level warning.
我也知道這是由只(不屬性)方法有效上面的句子, ,但我幾乎沒有成功地理解它實際上, 我很高興如果有任何事情可以請給我演示解釋上述句子的代碼, 祝您有愉快的一週。
我學習PHP,OOP和我在靜態, 在這個php.net/static我不明白這句話PHP,OOP,靜態
Calling non-static methods statically generates an E_STRICT level warning.
我也知道這是由只(不屬性)方法有效上面的句子, ,但我幾乎沒有成功地理解它實際上, 我很高興如果有任何事情可以請給我演示解釋上述句子的代碼, 祝您有愉快的一週。
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 - 靜態訪問非靜態方法,但不是致命錯誤,因爲此方法不訪問非靜態屬性。
另外兩個給出致命錯誤,因爲無法靜態訪問非靜態字段。
下面是他們對您提問的句子的含義的示例。
用一種方法考慮以下類(它不是靜態的)。
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將發出警告。
謝謝我閱讀你的解釋真的很好。 – Blanktext
如果一個方法是非靜態的,這意味着它屬於一個類的實例。例如,如果我們有一個名爲getDamage()
的方法Car
(計算汽車損壞程度),那麼您不應該以靜態方式調用此方法。
您應該只創建一個Car
類的實例,並在該實例上調用getDamage()
。這是有道理的,因爲特定的汽車可能會損壞25%,而另一輛汽車可能會損壞70%。
但以靜態方式調用getDamage()
沒有意義:靜態方法不屬於類的特定實例,而是屬於類本身。而Car
班沒有有效的方法給getDamage()
的結果。你仍然可以計算一個值(可能是0
),但它沒有任何意義。
謝謝你的解釋很好的邏輯之一。 – Blanktext
這是因爲即使您可以靜態調用非靜態方法,也不應該記錄它。
class Foo {
function bar(){
print "you should not do that";
}
}
Foo::bar();
居然會的工作,但你會得到一個E_STRICT警告,因爲你可以做到這一點,但你shouln't。
謝謝你,你的最後一行真的澄清了事情。 – Blanktext
它告訴你,如果你調用一個非靜態方法而沒有初始化它,我會給出一個E_STRICT警告。你不明白什麼?靜態意味着您可以調用該方法而無需將類初始化爲對象。 –
你應該瞭解的OOP和靜態調用最重要的是他們不混合。靜態調用是程序編程思維的一部分。 –
謝謝大家,我正在閱讀他們的答案。 – Blanktext