Вызов методов родительского класса

Вопрос, отредактированный для лучше отражения моих потребностей.


Возьмите следующий пример:

class Base
{
    public $Text = null;

    public function __construct()
    {
        $this->Text = new Base_Text();
    }
}

class Base_Text extends Base
{
    public $Is = null;

    public function __construct()
    {
        $this->Is = new Base_Text_Is();
    }

    public function CammelCase($string)
    {
        return trim(str_replace(' ', '', ucwords($string)));
    }
}

class Base_Text_Is extends Base_Text
{
    public function CammelCase($string)
    {
        return ($string === $this->CammelCase($string)); // doesn't work
    }
}

Как я могу зафиксировать Base_Text_Is::CammelCase() метод, не называя класс Base_Text статически (не использование parent:: или Base_Text::)?

Единственное решение, которое я предложил для этого вида ситуаций, состоит в том, чтобы создать одноэлементную функцию как это:

function Base()
{
    static $instance = null;

    if (is_null($instance) === true)
    {
        $instance = new Base();
    }

    return $instance;
}

И изменение Base_Text_Is::CammelCase() метод к этому:

return ($string === Base()->Text->CammelCase($string));

И чтобы не создавать два экземпляров объектов Базового класса вместо выполнения:

$base = new Base();
$base->Text->Is->CammelCase('MethodOverloading'); // true

Я просто делаю:

Base()->Text->Is->CammelCase('MethodOverloading'); // true

Действительно ли это - хорошая практика? Есть ли какие-либо другие решения?

5
задан Alix Axel 11 January 2010 в 02:16
поделиться

2 ответа

Суть вашего вопроса заключается в следующем:

Как Son :: B () может вызвать Dad :: A () метод нестатически (без использования родитель или папа)?

Ответ прост: не может. Вы переопределили Dad :: A () с помощью Son :: A () . Единственная концепция A () , которую теперь имеет объект Son, - это его собственная A () . Вы должны будете вызвать родительский метод статически или на совершенно другом экземпляре объекта Dad .

Суть в том, что если вы хотите вызвать родительский метод A () , почему вы вообще пытаетесь переопределить его?

Ваша структура тоже не имеет смысла . Зачем вам нужен вызов $ dad-> A () , чтобы передать его $ dad-> son-> A () , который, в свою очередь, вызовет $ dad -> son-> B () , который затем, исходя из того, что вы спрашиваете, снова вызовет $ dad-> A () ? Это бесконечный цикл.

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

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

РЕДАКТИРОВАТЬ

Я думаю, у вас слишком много наследования. Нет причин, по которым вы должны это делать:

$base = new Base();
$base->Text->Is->CammelCase('MethodOverloading'); // true

Если все функции находятся в дочерних классах, вам не следует создавать экземпляр класса Base . Это должно быть примерно так:

$text = new Text();
$text->isCamelCase('someString');

Ваш код можно значительно упростить, если удалить все циклические родительские / дочерние экземпляры и передать определенные функции дочерним классам:

class Base
{
    //don't put anything related to child classes here,
    //unless it is going to provide specific functionality
}

class Text extends Base
{
    public function CamelCase($string)
    {
        return trim(str_replace(' ', '', ucwords($string)));
    }

    public function isCamelCase($string)
    {
        return ($string === $this->CamelCase($string));
    }
}
7
ответ дан 14 December 2019 в 04:38
поделиться

Я не думаю, что есть способ вызвать родительский метод из дочернего, не вызывая его статически или используя parent :: . Хотя я могу неправильно понять вопрос. Создание экземпляра Son () не создает двух объектов. Сын расширяет папу, но это все еще одна цель.

Если вы собираетесь вызвать Dad () с помощью Singleton внутри Son, тогда зачем расширять его от Son?

1
ответ дан 14 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

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