Доступ к расширенному классу из родительского класса в переполнении стека

У меня есть два класса, класс A и класс B, я пытаюсь получить доступ к классу B через функцию в классе A.

На данный момент я могу сделать это, создав новый экземпляр класса B внутри функции в классе A, но я хочу знать, есть ли способ сделать это без создания нового экземпляра класса B внутри класса A ,

Вот пример того, что я хотел бы сделать:

class a{

function a(){
return $this->b();
}


}

class b extends a{

function b(){
return "It Works!";
}

}

$doIt = new a();
echo $doIt->a();

-1

Решение

Из вашего комментария:

В основном у меня есть класс B, который работает с базой данных, и класс A, который связывает действия пользователей на сайте с классом B. Таким образом, пользователь что-то делает -> класс A начинает работать-> Передает информацию в класс B для добавления в базу данных. Казалось, что это не все, что возможно, но я знаю, что есть люди с гораздо большим знанием, чем я, поэтому я хотел узнать, знает ли кто-нибудь еще о том, как это сделать.

Как вы описываете: B работает с базой данных, A выполняет действия (запрошенные пользователем). B звучит как какой-то маппер / объект доступа к данным, в то время как A звучит как услуга (я буду ссылаться на BMapper а также AService быть более обдуманным).

То, что вы обрисовали в общих чертах, указывает на то, что вы не правильно используете наследование PHP. Наследование представляет собой отношения. (Image это Media, PathMover является Animator, так далее…). Хотя ответ @ Malcolm технически работает, он не для вашего сценария.

В ООП мы бы сказали, что BMapper это зависимость AService, Таким образом, всякий раз, когда мы вызываем метод в AServiceмы ожидаем, что это будет зависеть от случая BMapper, Эти отношения удовлетворяются, как правило, через внедрение зависимости (увидеть: Что такое внедрение зависимостей?).

<?php

class AService {

private $bMapper;

public function __construct(BMapper $bMapper)
{
$this->bMapper = $bMapper;
}

public function doAction()
{
return $this->bMapper->performSomethingInDatabase();
}

}

class BMapper {

public function performSomethingInDatabase()
{
/**
* ..whatever
*/
}

}

$service = new AService(new BMapper);
$service->doAction();

Вы можете видеть, что мы определили зависимость нашего зависимого класса в его конструкторе, чтобы быть удовлетворенным тем, кто / что бы ни использовал этот класс.

2

Другие решения

Ты не можешь Но вы можете ожидать абстрактный метод.

abstract class a {
function a() {
return $this->b(); // OK
}
abstract function b(); // Has no method body. Classes extending this class will implement it
}
class b extends a {
function b() {
return 'something';
}
}
$doIt = new b(); // Cannot instantiate abstract class a
echo $doIt->a();
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector