8

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

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

3 回答 3

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

于 2012-05-01T02:19:18.713 回答
3

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

编辑:

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

于 2012-05-01T02:10:55.317 回答
0

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

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

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

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

于 2012-05-01T02:09:55.117 回答