如何在不创建前者对象的情况下从另一个不同类的方法静态调用类的非静态方法?



我使用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更新中被删除

最新更新