在PHP中,为什么我能访问非静态方法以静态方式?(In PHP, why I am able to

2019-07-29 05:09发布

在下面的代码,非静态()不是一个静态方法。 即使这样,我能够在没有创建一个对象(以静态方式)来访问它。 任何人都可以请帮我理解,因为这是不可能像Java语言编写的?

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

Answer 1:

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

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

他们也表现出类似的例子,但要注意:

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



Answer 2:

这是允许的, 它产生一个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



Answer 3:

它好像PHP的开发者没有看到禁止的非静态方法静态访问任何价值。 这只是PHP的那些特质的功能,并没有真正服务于一个目的之一。 这当然是不好的编程习惯静态调用非静态方法,但是在PHP是可能的。 也许在PHP的未来版本,他们将禁止这一点,但现在,它的语言只是一部分。

编辑:

值得庆幸的是,对面是不允许的-你不能叫从对象上下文的静态方法。 正如杰克下面指出的那样,你可以调用从对象上下文中的静态方法-这也很难在OOP范式的最佳实践,但它是允许的。



文章来源: In PHP, why I am able to access non-static method in a static way?
标签: php static