为什么我的PHP子类没有从父级获取公共和受保护的变量?

时间:2011-05-25 13:05:24

标签: php class inheritance

我有脑风,我怀疑这个很简单。 考虑这个代码,有两个类:

<?php    
class myparentclass {
    protected $vara;
    private $varb;
    public $varc;
    public $_childclass;

    function __construct() {
        $this->vara = "foo";
        $this->varb = "bar";
        $this->varc = ":(";
        $this->_childclass = new mychildclass;    
    }
}

class mychildclass extends myparentclass {
    function __construct() {
        print_r ($this);
    }
}

print "<pre>";
$foo = new myparentclass();

输出结果为:

mychildclass Object
(
    [vara:protected] => 
    [varb:private] => 
    [varc] => 
    [_childclass] => 
)

我知道不应该设置$ varb,但其他人呢?

6 个答案:

答案 0 :(得分:4)

如果您在子类中定义了一个新的__construct(),那么您需要显式调用父的构造函数。如果你没有在子类中定义任何__construct(),它将直接继承父类,并且所有这些属性都已设置。

class mychildclass extends myparentclass {
  function __construct() {
    // The parent constructor
    parent::__construct();
    print_r ($this);
  }
}

答案 1 :(得分:2)

您必须在子类构造函数中调用父类构造函数。

function __construct() {
        parent::__construct();
        print_r ($this);
    }

答案 2 :(得分:2)

如果在子类中重新定义构造函数,则必须调用父构造函数。

class mychildclass extends myparentclass {
 function __construct() {
     parent::__construct();
     print_r ($this);
 }
}

应该可以正常工作。

答案 3 :(得分:1)

如果子类具有自己的构造函数,则必须从其中显式调用父构造函数(如果要调用它):

parent::__construct();

答案 4 :(得分:1)

您的父构造函数永远不会被子项执行。像这样修改mychildclass:

function __construct() {
    parent::__construct();
    print_r ($this);
}

答案 5 :(得分:1)

您使用父类中的构造函数覆盖父类的构造函数。您可以使用parent :: __ construct();

从子类调用父的构造函数

然而,myparentclass的构造函数的最后一行调用mychildclass的构造函数,而mychildclass又调用父构造函数,等等。你的意思是实现这个目标吗?

<?php    
class myparentclass {
    protected $vara;
    private $varb;
    public $varc;

    function __construct() {
        $this->vara = "foo";
        $this->varb = "bar";
        $this->varc = ":(";
    }
}

class mychildclass extends myparentclass {
    function __construct() {
        parent::__construct();
        print_r ($this);
    }
}

print "<pre>";
$foo = new mychildclass();