我使用PHP 7.1.11
考虑以下代码:
<?php
class A {
function foo() {
if (isset($this)) {
echo '$this is defined (';
echo get_class($this);
echo ")n";
} else {
echo "$this is not defined.n";
}
}
}
class B {
function bar() {
A::foo();
}
}
$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>
上述代码输出:
$this is defined (A)
$this is not defined.
$this is not defined.
$this is not defined.
除了输出中的第一行之外,接下来的三行输出是通过静态调用class A
中存在的非静态方法foo()
(即,不创建class A
的对象)生成的。
有人请解释一下这是怎么发生的?
来自另一个类的非静态方法是如何从所考虑的类的类/对象(即这里的class B
)静态调用的?
谢谢。
注意:PHP在静态与非静态方法方面非常宽松
但是:不应静态调用非静态方法(即使PHP是宽容的)。为什么?
如果一个方法不是静态的,这通常意味着它取决于实例的状态,因为否则它可能会变为静态。
有时非静态方法不依赖于实例,因此程序仍然可以工作,因为此方法可能是静态的但你永远不应该这样做。
此外,如果你打开错误报告,PHP也会告诉你:
$this is defined(A)
已弃用:非静态方法A: :foo()不应在第行的[…][…]中静态调用25
$未对此进行定义
已弃用:不应在中静态调用非静态方法A::foo()[…][…]第18行
$未对此进行定义
不推荐:不应调用非静态方法b::bar()static在[…][…]第29
行中已弃用:不应调用非静态方法A::foo()静态地在[…][…]第18
$行定义
弃用也意味着:正因为PHP仍然允许这样做,它很可能会在未来的PHP更新中被删除