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

Автозапчасти могут быть интересными, например, Вы могли бы иметь

class part
{
    OEM
    Manufacturer
    Number
    Description
}

class Tire extends Part
{
   Speed
   Rating

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

6 ответов

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

// 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
поделиться

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

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

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

Затем в Kiddo вы используете:

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

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

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

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

Для этого есть более простое решение, но оно требует, чтобы вы точно знали, через какое количество наследований прошел ваш текущий класс. К счастью, аргументы get_parent_class () позволяют члену вашего массива класса быть именем класса в виде строки, а также самим экземпляром.

Имейте в виду, что это также по своей сути основано на статическом вызове метода __construct () класса, хотя в пределах экземпляра области видимости наследующего объекта разница в этом конкретном случае незначительна (ах, PHP).

Примите во внимание следующее:

class Foo {
    var $f = 'bad (Foo)';

    function __construct() {
        $this->f = 'Good!';
    }
}

class Bar extends Foo {
    var $f = 'bad (Bar)';
}

class FooBar extends Bar {
    var $f = 'bad (FooBar)';

    function __construct() {
        # FooBar constructor logic here
        call_user_func(array(get_parent_class(get_parent_class($this)), '__construct'));
    }
}

$foo = new FooBar();
echo $foo->f; #=> 'Good!'

Опять же, это не жизнеспособное решение для ситуации, когда вы не знаете, сколько наследования произошло, из-за ограничений debug_backtrace (), но в контролируемых обстоятельствах это работает как предполагалось.

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

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