我很难理解伪变量 $ this 。以下面的代码为例:
<?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";
}
}
}
$a = new A();
$a->foo();
A::foo();
?>
将输出:
$this is defined (A)
$this is not defined.
好的,这个输出对我来说很有意义,因为 $ a-&gt; foo 指的是一个实例而 A :: foo 指的是没有实例化的类。但是,如果我们将以下代码附加到第一个示例,请采用另一个示例:
<?php
class B
{
function bar()
{
A::foo();
}
}
$b = new B();
$b->bar();
B::bar();
?>
它将输出:
$this is defined (B)
$this is not defined.
我可以理解第二个输出,因为 B :: bar(); 指的是一个类,而不是一个实例。但我没有得到第一个输出。为什么$ this实例化,如果方法调用 A :: foo(); ,这是一个类,不应该实例化,更糟糕的是,为什么 $ this 是 B 的实例,而不是 A 的实例?
感谢您的关注!
答案 0 :(得分:3)
$this
指的是您当前的对象。所以它与你在bar()方法中调用的内容无关。因为你正在创建B的对象($ b = new B();)所以你得到的输出为$this is defined (B)
This POST会让你更好地了解$ this和self
答案 1 :(得分:1)
通过实例化B,您将$ this设置为B的实例。
由于A :: foo()回显$ this,如果已定义(因为你在B实例中调用A :: foo(),你会看到A :: foo()回显B实例。
$b = new B() // any member function of B has $this defined now.
$b->bar() // member function of B, $this is defined. A::foo() will echo B's instance of $this
A::foo() // no class instantiation, $this is not defined
B::bar() // no class instantiated, $this is not defined as you pointed out earlier.