@oloref

Связи в ООП, Агрегация в PHP как часто используется?

Заметил, что в PHP если и используется связи между объектами(ассоциация), то только в виде композиции, а не агрегации. Я правильно думаю?

Если да, то это наверное обусловлено протоколом HTTP поверх которого работают наши сайты на PHP?
мол в рамках одного HTTP-запроса редко бывает, когда создаётся самостоятельный класс, а потом он ещё и в другой класс попадает.

Мои размышления близки к правде)?
  • Вопрос задан
  • 875 просмотров
Пригласить эксперта
Ответы на вопрос 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Основа всех современных фреймворков - это контейнер зависимостей. Который, создавая на лету экземпляр требующегося для обработки НТТР запроса класса, "внедряет" в него (через конструктор или через параметры методов) необходимые этому создаваемому объекту/вызываемому методу зависимости. Создавая их на лету или используя готовые.
И, в свою очередь, создавая эти зависимости, также внедряет нужные уже им сервисы. И так по цепочке.

Если вы посмотрите на пример реализации контроллера в Симфони например, то вы нигде не увидите что-то вроде
public function process()
{
    $request = new Request();
    $param = $request->get('name')
}

а только
public function process(Request $request)
{
    $param = $this->request->get('name')
}


Заметил, что в PHP если и используется связи между объектами(ассоциация), то только в виде композиции,

А вот тут я реально удивился. Скорее это я бы у вас попросил "пример кода" в котором "вы заметили" композицию. Потому что в современном РНР коде её днем с огнём не найти - везде сплошная агрегация. Даже там, где по сути подошла бы и композиция. Давно ли вы видели в коде создание new Сlass внутри класса вместо использования $this->object? И если да - то мне страшно любопытно - где?

Хотя нет, кажется я понял. Есть такие гении, которые действительно, вместо
class User
{
    public function __construct(Database $db)
    {
        $this->db = $db;
    }
}

пишут
class User
{
    protected $db;
    public function __construct()
    {
        $this->db = new Database();
    }
}

Но тут надо понимать, что это дети, которые вчера увидели редактор кода. Больше никто так не пишет.
(Тут надо оговориться, что это не догма, и внедрение через параметры не обязательно. Вполне можно создать какой-то объект и на лету, но это случается гораздо реже, чем использование уже готового)

редко бывает, когда создаётся самостоятельный класс, а потом он ещё и в другой класс попадает.

А здесь вы вообще какую-то чушь написали. Если говорить про классы, то они вообще почти никогда не создаются кодом на лету. Классы пишет программист, и сохраняет в коде программы. Которая потом выполняется, и создает из этих классов объекты.
А если вы имели в виду объекты, то их создаётся миллион, и все они "попадают" в другие объекты. Даже при обработке НТТР запроса
Ответ написан
MyraJKee
@MyraJKee
Агрегация позволяет гораздо проще писать юнит-тесты, понятно почему. Все зависимости в конструкторе и их легко подменить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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