簡體   English   中英

在PHP中,為什么我能夠以靜態方式訪問非靜態方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM