Вопрос, отредактированный для лучше отражения моих потребностей.
Возьмите следующий пример:
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
Действительно ли это - хорошая практика? Есть ли какие-либо другие решения?
Суть вашего вопроса заключается в следующем:
Как 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));
}
}
Я не думаю, что есть способ вызвать родительский метод из дочернего, не вызывая его статически или используя parent ::
. Хотя я могу неправильно понять вопрос. Создание экземпляра Son () не создает двух объектов. Сын расширяет папу, но это все еще одна цель.
Если вы собираетесь вызвать Dad () с помощью Singleton внутри Son, тогда зачем расширять его от Son?