我有脑风,我怀疑这个很简单。 考虑这个代码,有两个类:
<?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,但其他人呢?
答案 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();