Как вызвать конструктор суперкласса из N-го подкласса

Я хочу знать, как я могу вызвать конструктор супер-родительского класса из 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, где мне нужно вызвать конструктор класса A из класса C.


person neeraj    schedule 17.07.2012    source источник


Ответы (4)


У вас нет возможности вызвать конструктор class a из class c, используя ссылку parent, поскольку для таких вещей, как parent::parent::etc, не предусмотрена функциональность.


Еще одно замечание: то, что вы делаете, противоречит цели наследования. класс c не должен осознавать тот факт, что его база фактически наследует класс a.

Если класс b хотел, чтобы конструктор класса a был запущен, он должен был реализовать это, что приводит к тому, что если класс c хочет вызвать Конструктор класса a должен наследоваться от класса a, не класса b.


Эй, я хочу жить на грани - перестань говорить мне, что я не могу сделать!! один

Что ж, если вы действительно хотите обойти это, вы можете явно вызвать конструктор class a, используя следующее:

class c extends b { 
  public function __construct(){
    a::__construct ();
  }    
}
person Filip Roséen - refp    schedule 17.07.2012
comment
Я думаю, что это гораздо лучший способ вызова конструкции A в B и вызова конструктора B в C. - person neeraj; 17.07.2012

Вы можете напрямую вызвать a::__construct() из c::__construct, но это плохая идея.

Не делай этого!

Тот факт, что вы чувствуете необходимость сделать это, показывает, что, скорее всего, в этой иерархии классов есть серьезные проблемы. Зачем c обходить конструктор b, если b должен был наследоваться?

person Jon    schedule 17.07.2012
comment
На самом деле, я думал, что в php может быть прямая функция. В любом случае, это было особое требование... но вызов конструктора с прямым именем класса может работать. Спасибо за ваше предложение - person neeraj; 17.07.2012

Вы должны всегда вызывать родительский конструктор в дочерних классах следующим образом:

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;

Именно так вы реализуете принципы ООП. Если каким-то образом вам нужно, чтобы класс не вызывал родительский конструктор - этот класс должен быть новым базовым классом для другой иерархии, а не дочерним элементом в каком-то дереве. Подробнее о конструкторах: http://www.php.net/manual/en/language.oop5.decon.php

person НЛО    schedule 17.07.2012

Помимо того, что я согласен с другими, что это вообще плохая практика, у меня есть еще один способ сделать это. Вы можете использовать отражение, чтобы получить имя класса родительского родителя:

$reflection = new \ReflectionClass($this);
$grandParent = $reflection->getParentClass()->getParentClass()->getName();
$grandParent::__construct();
person VaclavSir    schedule 28.07.2013