在PHP中,为什么我能够以静态方式访问非静态方法?

时间:2012-05-01 02:06:05

标签: php static

在以下代码中,nonStatic()不是静态方法。即使这样,我也能够在不创建对象的情况下(以静态方式)访问它。任何人都可以帮助我理解,因为这在Java等其他语言中是不可能的吗?

<?php
class MyClass
{
    function nonStatic() {
        echo "This can be printed";
    }
}
MyClass::nonStatic(); // This can be printed

3 个答案:

答案 0 :(得分:6)

允许,会产生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

答案 1 :(得分:3)

似乎PHP的开发人员在禁止非静态方法的静态访问方面没有看到任何价值。这只是PHP的一些特殊功能,它们并不真正起作用。静态调用非静态方法当然是不好的编程习惯,但在PHP中它是可能的。也许在未来的PHP版本中,他们不会允许这样做,但就目前而言,它只是该语言的一部分。

修改

值得庆幸的是,相反是不允许的 - 你不能从对象上下文中调用静态方法。正如Jack在下面指出的那样,你可以从一个静态方法调用对象上下文 - 在OOP范例中几乎不是最佳实践,但它是允许的。

答案 2 :(得分:0)

不确定,可能是一些PHP魔术(有时候有点像),但你不应该这样做。

在此处阅读更多http://php.net/manual/en/language.oop5.static.php

他们也展示了一个类似的例子,但请注意:

静态调用非静态方法会生成E_STRICT级警告,这意味着此魔法能力可能会在将来的版本中消失。所以不要这样做:)