6

嗨,我有一个关于 $this 的问题。

class foo {

    function __construct(){

       $this->foo = 'bar';

    }

}

class bar extends foo {

    function __construct() {

        $this->bar = $this->foo;

    }

}

$ob = new foo();
$ob = new bar();
echo $ob->bar;

结果bar??

我只是问,因为我认为它会,但我的脚本的一部分似乎并没有导致我的想法。

4

3 回答 3

9

引用PHP 手册

注意:如果子类定义了构造函数,则不会隐式调用父构造函数。为了运行父构造函数,需要在子构造函数中调用parent::__construct()

这意味着在您的示例中,当构造函数bar运行时,它不会运行构造函数foo,因此$this->foo仍然未定义。

于 2010-11-07T15:33:13.593 回答
5

PHP 有点奇怪,如果您定义子构造函数,则不会自动调用父构造函数- 您必须自己调用它。因此,要获得您想要的行为,请执行此操作

class bar extends foo {

    function __construct() {

         parent::__construct();
         $this->bar = $this->foo;

    }

}
于 2010-11-07T15:33:21.113 回答
0

您不会同时创建 foo 和 bar 的实例。创建 bar 的单个实例。

$ob = new bar(); 
echo $ob->bar;

正如其他答案所指出的,在 bar 构造函数中调用 parent::__construct()

于 2010-11-07T15:34:44.513 回答