[英]In PHP, why I am able to access non-static method in a static way?
在以下代碼中,nonStatic()不是靜態方法。 即使這樣,我也能夠在不創建對象的情況下(以靜態方式)訪問它。 任何人都可以幫助我理解,因為這在Java等其他語言中是不可能的嗎?
<?php
class MyClass
{
function nonStatic() {
echo "This can be printed";
}
}
MyClass::nonStatic(); // This can be printed
它是允許的, 但它會生成一個E_STRICT
警告:
Error #: 2048, Error: Non-static method MyClass::nonStatic() should not be called statically, assuming $this from incompatible context
在PHP的早期OO實現中,這是默默允許的,但是后來采用了更好的實踐。
相反的工作沒有任何障礙:
class Test
{
function foo()
{
echo $this->bar();
}
static function bar()
{
return "Hello world\n";
}
}
$x = new Test;
$x->foo();
這打印Hello world
。
似乎PHP的開發人員認為不允許靜態訪問非靜態方法有任何價值。 這只是PHP的一些特殊功能,它們並不真正起作用。 靜態調用非靜態方法當然是不好的編程習慣,但在PHP中它是可能的。 也許在未來的PHP版本中,他們會不允許這樣做,但就目前而言,它只是該語言的一部分。
編輯:
值得慶幸的是,不允許相反 - 您無法從對象上下文中調用靜態方法。
正如Jack在下面指出的那樣,你可以從一個對象上下文中調用一個靜態方法 - 這在OOP范例中幾乎不是最佳實踐,但它是允許的。
不確定,可能是一些PHP魔術(有時候有點像),但你不應該這樣做。
在這里閱讀更多http://php.net/manual/en/language.oop5.static.php
他們也展示了一個類似的例子,但請注意:
靜態調用非靜態方法會生成E_STRICT級別警告,這意味着此魔法能力可能會在將來的版本中消失。 所以不要這樣做:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.