Доступ к расширенному классу из родительского класса в PHP - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть два класса, класс 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();

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

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

По сути, у меня есть класс 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();

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

0 голосов
/ 11 февраля 2019

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

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...