我想知道如何从第N(第2或第3或任何)子类调用超级父类的构造函数。
class a{
public function __construct(){
echo "<br>In constructor of class A <br>";
}
}
class b extends a {
public function __construct(){
echo "<br>In constructor of class B <br>";
}
}
class c extends b {
public function __construct(){
parent::__construct();
echo "<br>In constructor of class C <br>";
}
}
$obj = new c;
我需要在上面C类的构造函数中进行哪些更改,其中调用父代的构造函数。 Parent :: __construct();引用B类的consructor,因为我需要从C类调用A类的构造函数。
答案 0 :(得分:6)
您无法使用class a
引用从class c
调用parent
的构造函数,因为parent::parent::etc
等内容没有提供任何功能。< / p>
另一方面说明:你正在做的事情会破坏继承的目的.. class c 不应该意识到它的基础实际上是继承了 class a
如果 class b 想要类的构造函数要运行它应该已经实现了这个,这就产生了如果 class c 想要调用 class a 的构造函数,它应该继承自 class a ,而不是 class b 。
好吧,如果你真的想破解你的方法,可以使用下面的方法显式调用 class a 的构造函数:
class c extends b {
public function __construct(){
a::__construct ();
}
}
答案 1 :(得分:2)
您可以直接从a::__construct()
内拨打c::__construct
,但这不是一个好主意。
您认为需要这样做的事实表明,这个类层次结构很可能存在严重的潜在问题。如果c
意图继承,b
为什么要绕过b
的构造函数?
答案 2 :(得分:0)
你应该总是在子类中调用父'构造函数:
class a{
public function __construct(){
echo "<br>In constructor of class A <br>";
}
}
class b extends a {
public function __construct(){
parent::__construct();
echo "<br>In constructor of class B <br>";
}
}
class c extends b {
public function __construct(){
parent::__construct();
echo "<br>In constructor of class C <br>";
}
}
$obj = new c;
这就是你实施OOP原则的方式。如果不知何故你需要类不要调用父'构造函数 - 这个类应该是另一个ierarchy的新基类,而不是某个树中的子类。 有关构造函数的更多信息:http://www.php.net/manual/en/language.oop5.decon.php
答案 3 :(得分:0)
除了与他人达成协议外,这通常是一种不好的做法,我还有一种方法可以做到这一点。您可以使用反射来获取父级父级的类名:
$reflection = new \ReflectionClass($this);
$grandParent = $reflection->getParentClass()->getParentClass()->getName();
$grandParent::__construct();