如何从第N个子类调用超类构造函数

时间:2012-07-17 07:56:03

标签: php class constructor call super

我想知道如何从第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类的构造函数。

4 个答案:

答案 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();
相关问题