$ this和PHP中的实例化类

时间:2014-02-06 07:33:23

标签: php oop

我很难理解伪变量 $ 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 的实例?

感谢您的关注!

2 个答案:

答案 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.