1

我想知道如何从第 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 的构造函数中进行哪些更改。父:: __construct(); 指 B 类的构造函数,因为我需要从 C 类调用 A 类的构造函数。

4

4 回答 4

6

您无法使用引用调用class a的构造函数,因为没有为诸如.class cparentparent::parent::etc


另一方面:您所做的事情有点违背继承的目的。c 类不应该意识到它的基础实际上继承了 a 类

如果class b想要运行class a的构造函数,它应该已经实现了 this,这就产生了这样一个事实,即如果class c想要调用class a的构造函数,它应该从class a继承,而不是 class b


嘿,我想生活在边缘 - 不要告诉我我不能做什么!

好吧,如果您真的想解决这个问题,您可以使用以下命令显式调用class a的构造函数:

class c extends b { 
  public function __construct(){
    a::__construct ();
  }    
}
于 2012-07-17T08:04:32.490 回答
2

您可以直接a::__construct()从inside 调用c::__construct,但这是一个坏主意。

不要做!

您觉得有必要这样做的事实表明,这个类层次结构很可能存在严重的潜在问题。为什么c要绕过bif的构造函数b被继承?

于 2012-07-17T07:58:37.733 回答
0

除了同意其他人的观点,这通常是一种不好的做法,我还有另一种方法可以做到这一点。您可以使用反射来获取父级父级的类名:

$reflection = new \ReflectionClass($this);
$grandParent = $reflection->getParentClass()->getParentClass()->getName();
$grandParent::__construct();
于 2013-07-28T01:02:14.580 回答
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 原则的方式。如果不知何故你需要类不调用父的构造函数 - 这个类应该是另一个层次结构的新基类,而不是某个树中的子类。更多关于构造函数:http ://www.php.net/manual/en/language.oop5.decon.php

于 2012-07-17T08:18:30.110 回答