Как я заставляю конструктора класса PHP вызывать конструктора родителя своего родителя?

У меня должен быть конструктор класса в вызове PHP родитель его родителя (прародитель?) конструктор, не вызывая родительского конструктора.

// 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
    }
}

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

194
задан yivi 24 September 2019 в 08:46
поделиться

4 ответа

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

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

    }

}

class Papa extends Grandpa
{
    public function __construct($bypass = false)
    {
        // only perform actions inside if not bypassing
        if (!$bypass) {

        }
        // call Grandpa's constructor
        parent::__construct();
    }
}

class Kiddo extends Papa
{
    public function __construct()
    {
        $bypassPapa = true;
        parent::__construct($bypassPapa);
    }
}
147
ответ дан 23 November 2019 в 05:25
поделиться

В итоге я придумал альтернативное решение, которое решило проблему.

  • Я создал промежуточный класс, расширяющий дедушку.
  • Затем и Папа, и Киддо расширили этот класс.
  • ] Киддо требовал некоторой промежуточной функциональности Папы, но не любил его конструктор, поэтому у класса была эта дополнительная функциональность, и оба расширяли ее.

Я поддержал два других ответа, которые предоставили действительные, но уродливые решения для более уродливого вопроса :)

19
ответ дан 23 November 2019 в 05:25
поделиться

Другой вариант, который не использует флаг и может работать в вашей ситуации:

<?php
// main class that everything inherits
class Grandpa 
{
    public function __construct(){
        $this->GrandpaSetup();
    }

    public function GrandpaSetup(){
        $this->prop1 = 'foo';
        $this->prop2 = 'bar';
    }
}

class Papa extends Grandpa
{
    public function __construct()
    {
        // call Grandpa's constructor
        parent::__construct();
        $this->prop1 = 'foobar';
    }

}
class Kiddo extends Papa
{
    public function __construct()
    {
        $this->GrandpaSetup();
    }
}

$kid = new Kiddo();
echo "{$kid->prop1}\n{$kid->prop2}\n";
16
ответ дан 23 November 2019 в 05:25
поделиться

Вы можете посмотреть это видео от службы технической поддержки Google, в котором объясняются передовые методы кодирования JavaScript, которое является основной частью разработки расширений Firefox

http://www.youtube.com/watch?v=0LKDImgRfrg

alt text http://0.gvt0.com/ThumbnailServer2?app=vss&contentid=4d0ae57a8484fdf8&offsetms=275000&itag=w160&hl=en&sigh=GnGo87Drht4wi2JvP1L0PtvKT4-) Необходимо использовать 11-2982 [1267102] ) , другого ярлыка нет. Также,

71
ответ дан 23 November 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: