在下面的代码,非静态()不是一个静态方法。 即使这样,我能够在没有创建一个对象(以静态方式)来访问它。 任何人都可以请帮我理解,因为这是不可能像Java语言编写的?
<?php
class MyClass
{
function nonStatic() {
echo "This can be printed";
}
}
MyClass::nonStatic(); // This can be printed
在下面的代码,非静态()不是一个静态方法。 即使这样,我能够在没有创建一个对象(以静态方式)来访问它。 任何人都可以请帮我理解,因为这是不可能像Java语言编写的?
<?php
class MyClass
{
function nonStatic() {
echo "This can be printed";
}
}
MyClass::nonStatic(); // This can be printed
不知道,可能是一些PHP魔术(这是一个有点像,有时),但你不应该这样做。
在这里阅读更多http://php.net/manual/en/language.oop5.static.php
他们也表现出类似的例子,但要注意:
调用非静态方法静态生成E_STRICT级别的警告意味着这个魔法能力在未来的版本可能会消失。 所以,不要做:)
这是允许的, 但它产生一个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的未来版本,他们将禁止这一点,但现在,它的语言只是一部分。
编辑:
值得庆幸的是,对面是不允许的-你不能叫从对象上下文的静态方法。 正如杰克下面指出的那样,你可以调用从对象上下文中的静态方法-这也很难在OOP范式的最佳实践,但它是允许的。