Внедрение зависимостей в абстрактный конструктор

class Test {
function test()
{
return 'test';
}
}abstract class MasterAbstract {

public function __construct (Test $test)
{
$this->test = test;
}

protected function runMaster()
{
return $this->test->test();
}

}

class Child extends MasterAbstract
{
public function run()
{
return 1212;
}
}

Случай 1:

$c = new Child();
echo $c->run;

Получение ошибки здесь

Аргумент 1, переданный в MasterAbstract :: __ construct (), должен быть экземпляром
испытания, не дано

Случай 2: в этом я не создаю никакой объект для дочернего элемента или некоторого другого контроллера. Работает . Я использую Laravel Framework

class SomeotherController
{
private $ch;

public function __constructor(Child $ch)
{
$this->ch = $ch;
}

public function run()
{
return $this->ch->run();
}
}

Пожалуйста, кто-нибудь объяснит, как эти два дела работают?

1

Решение

В случае № 2 Вы вводите Child класс объекта с параметром конструктора, который разрешается IoC Ларавела

В случае № 1 Вы создаете Child объект с new и вам нужно дать Test класс в параметре.

Если вы хотите сделать так, вы можете вызвать метод make контейнера приложения:

$c = app(Child::class);
echo $c->run;

app(Child::class) такой же как \App::make(Child::class), Он дает вам новый экземпляр объекта и автоматически разрешает зависимости.

2

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

Других решений пока нет …