Нет, это невозможно, вы можете прочитать через контейнер кода IoC здесь:
laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php
на линии 466
Как вы видите, он пытается решить и parse parents Класс __constructor
метод с помощью отражений.
Я думаю, что было бы интересно реализовать, так как это вполне возможно, расширив класс Container
, чтобы также поддерживать затворы.
Я сделал несколько тестов, чтобы убедиться, что это возможно, так вот они:
class t4 {
public $x = "inject me";
}
interface t5 {}
$t3 = function(t4 $test) {
return print($test);
};
$r = new ReflectionFunction($t3);
$params = $r->getParameters();
$injection = $params[0]->getClass();
if (!$injection->isInstantiable()) {
throw new Exception('Provided type hint is not instantiable');
}
$typehinted = $injection->newInstance();
print($typehinted->x); // prints "inject me"
Тип намекая t5 будет бросать исключение.
Это отвечает на вопрос
Есть ли способ сделать это с закрытием?
Что касается того, как это реализовать, на мой взгляд, у вас должно быть полное знание того, как отражены и работают Laravel IoC. Я думаю, что это не будет реализовано в ближайшем будущем, поскольку Laravel в основном строится на классах. Каковы ваши варианты использования?
Большое спасибо за такой подробный ответ! Я надеялся, что так или иначе. Я собираюсь реализовать его сам, так, как вы его показали. Мой вариант использования: мне нравятся замыкания, и они хорошо используются в PHP, в определенных сценариях. Использование автоматизированной инъекции зависимостей было бы неплохо. –
Отлично, вам понравилось, можете ли вы предоставить варианты использования в Laravel? Мне просто интересно :) –