Как получить конструктор класса PHP для вызова конструктора родительского родительского элемента - PullRequest
186 голосов
/ 13 октября 2009

Мне нужно, чтобы конструктор класса в PHP вызывал конструктор его родителя parent (grandparent?) Без вызова родительского конструктора.

// main class that everything inherits
class Grandpa 
{
    public function __construct()
    {

    }

}

class Papa extends Grandpa
{
    public function __construct()
    {
        // call Grandpa's constructor
        parent::__construct();
    }
}

class Kiddo extends Papa
{
    public function __construct()
    {
        // THIS IS WHERE I NEED TO CALL GRANDPA'S
        // CONSTRUCTOR AND NOT PAPA'S
    }
}

Я знаю, что это странная вещь, и я пытаюсь найти средство, которое не пахнет плохо, но, тем не менее, мне любопытно, возможно ли это.

EDIT

Я подумал, что должен опубликовать обоснование для выбранного ответа. Причина в том, это наиболее элегантное решение проблемы вызова конструктора «дедушки и бабушки» при сохранении всех значений. Это, конечно, не лучший подход и не ООП-дружественный, но вопрос не в этом.

Для тех, кто сталкивается с этим вопросом позднее - Пожалуйста, найдите другое решение . Я смог найти гораздо лучший подход, который не нанес бы ущерба структуре класса. Так и вам.

Ответы [ 15 ]

2 голосов
/ 18 июля 2014
<?php

class grand_pa
{
    public function __construct()
    {
        echo "Hey I am Grand Pa <br>";
    }
}

class pa_pa extends grand_pa
{
    // no need for construct here unless you want to do something specifically within this class as init stuff
    // the construct for this class will be inherited from the parent.
}

class kiddo extends pa_pa
{
    public function __construct()
    {
        parent::__construct();
        echo "Hey I am a child <br>";
    }
}

new kiddo();
?>

Конечно, это предполагает, что вам не нужно ничего делать внутри конструкции pa_pa. Выполнение этого выдаст:

Эй, я Гранд Па Эй, я ребенок

2 голосов
/ 22 марта 2010

Хорошо, еще одно уродливое решение:

Создайте функцию в Папе, как:

protected function call2Granpa() {
     return parent::__construct();
}

Тогда в Kiddo вы используете:

parent::call2Granpa(); // вместо вызова конструктора в Papa.

Я думаю, что это может сработать ... Я не проверял это, поэтому я не уверен, что объекты созданы правильно.

Я использовал этот подход, но с неконструктивными функциями.

1 голос
/ 26 августа 2015
    class Grandpa 
{
    public function __construct()
    {
        echo"Hello Kiddo";
    }    
}

class Papa extends Grandpa
{
    public function __construct()
    {            
    }
    public function CallGranddad()
    {
        parent::__construct();
    }
}

class Kiddo extends Papa
{
    public function __construct()
    {

    }
    public function needSomethingFromGrandDad
    {
       parent::CallGranddad();
    }
}
1 голос
/ 10 мая 2013
// main class that everything inherits
class Grandpa 
{
    public function __construct()
    {
        $this->___construct();
    }

    protected function ___construct()
    {
        // grandpa's logic
    }

}

class Papa extends Grandpa
{
    public function __construct()
    {
        // call Grandpa's constructor
        parent::__construct();
    }
}

class Kiddo extends Papa
{
    public function __construct()
    {
        parent::___construct();
    }
}

обратите внимание, что "___construct" - это не волшебное имя, его можно назвать "doGrandpaStuff".

0 голосов
/ 10 июля 2017

из php 7 вы можете использовать

parent::parent::__construct();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...