在下面的代码中,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级警告,这意味着此魔法能力可能会在未来版本中消失。所以不要这样做:)