Laravel (и многие другие приложения) используют Внедрение зависимостей для достижения этой магии - ваши слова, а не мои!: D
Кажется, что Service Container - это то, что обрабатывает это в Laravel и должно помочь вам.
Непосредственно из документов Laravel (ссылка выше):
Внутри поставщика услуг у вас всегда есть доступ к контейнеру через свойство $ this-> app.Мы можем зарегистрировать привязку, используя метод bind, передавая имя класса или интерфейса, которое мы хотим зарегистрировать, вместе с Closure, который возвращает экземпляр класса:
$this->app->bind('HelpSpot\API', function ($app) {
return new HelpSpot\API($app->make('HttpClient'));
});
Также:
Вы можете использовать метод make для разрешения экземпляра класса из контейнера.Метод make принимает имя класса или интерфейса, который вы хотите разрешить:
$api = $this->app->make('HelpSpot\API');
И:
Если некоторые зависимости вашего класса не могут быть разрешены с помощьюконтейнер, вы можете вставить их, передав их как ассоциативный массив в метод makeWith:
$api = $this->app->makeWith('HelpSpot\API', ['id' => 1]);
ИМХО, я бы посмотрел, где и как это реализовано в нативном Laravelкод (обычно поставщик Illuminate) и посмотрите, как он используется / предназначен для реализации.
Кроме того, ClassName::class
вернет пространство имен + класс этого класса.Вот почему вы видите только имя класса и фактически не получаете объект / экземпляр этого класса.
Я не уверен, что / где / почему / как вы реализуете свой класс и зачем вам это нужноэта функциональность где-то, что он еще не существует.Laravel очень хорош в том, что уже настроил вещи там, где они вам нужны, так что подумайте дважды, прежде чем выходить из коробки, и убедитесь, что для вашей ситуации не существует решения по умолчанию!