@topuserman

Как внедрять зависимость (композиция), и зависеть от интерфейса?

Например есть такой код:

class A {
	
	private $b;

	public function __construct() {
		$this->b = new B();
	}

}

class B {
	// ...
}


т.к. класс - A имеет зависимость от класса B, для этого использую композицию, чтобы при удалении класс А - удалялись все его зависимости.

Но нужно сделать так, чтобы можно было легко подменить класс B - на любой другой класс, с похожим поведением.

Для этого создал интерфейс:
class B implements bInterface {
	// ...
}

interface bInterface {
	..
}


Но теперь, непонятно, как внедрить эту зависимость в класс А - и сохранить композицию ?

Есть предположение, что нужно делать так:

class A {
	
	private $b;

	public function __construct(bInterface $b) {
		$this->b = new $b();
	}

}

class B implements bInterface {
	// ...
}

interface bInterface {
	..
}

$a = new A(B::class);


но не уверен что делают именно так.

ps: знаю, что это можно легко сделать DI-контейнеры, но сейчас нужно без них.
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 1
@galliard
Для реализации композиции нужно не чтобы B создавался внутри A, а чтобы B удалялся вместе с A.

То есть, например
function factoryA(): A {
    $b = new B();
    
    return new A($b);
}


Таким образом после создания A единственная ссылка на B будет внутри него у удалится вместе с ним.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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