У меня есть два класса, класс 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();
Из вашего комментария:
В основном у меня есть класс 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();
Вы можете видеть, что мы определили зависимость нашего зависимого класса в его конструкторе, чтобы быть удовлетворенным тем, кто / что бы ни использовал этот класс.
Ты не можешь Но вы можете ожидать абстрактный метод.
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();