在官方 Symfony 文档中,有如下示例
use Symfony\Component\HttpFoundation\Session\SessionInterface;
public function index(SessionInterface $session)
{
// stores an attribute for reuse during a later user request
$session->set('foo', 'bar');
// gets the attribute set by another controller in another request
$foobar = $session->get('foobar');
// uses a default value if the attribute doesn't exist
$filters = $session->get('filters', []);
}
我想知道它是如何工作的,如果你将它作为参数传递给接口函数,那么当它被调用时,函数会自动接收它。我想在一个项目中应用它,不幸的是,这个项目最初是在没有框架的情况下编写的。
不久前,我问自己同样的问题。在PHP中有Reflection之类的东西,这是来自 Wikipedia 的引用。
用简单的语言来说,程序会分析自己,在调用控制器方法之前,它会查看输入参数,如果找到它会尝试解析. 她从哪里得到它们?从属性容器。
您可以自己编写所有这些,但您需要对 OOP 和设计模式有很好的了解。
这种方法在许多框架中实现,包括Symfony和Laravel
这里有一些链接,我做了类似的事情:
php.net 上反射部分的官方文档
Habré文章 PHP 反射 API 简介
文章什么是 PHP 中的依赖注入
这是一个相当广泛的问题,它根本无法将所有内容都放入一个答案中,它至少会提取整篇文章,其中包含指向进一步研究的来源的链接。我只是用手指指向要移动的方向。
这种魔法
Service Container
尤其如此autowiring
。如果早期需要直接从容器中获取依赖项,在控制器的情况下,或者如果您描述服务的依赖项,则在服务中描述,那么从版本 3.4 开始,ServiceContainer 可以做到这一点非常神奇。没有人能比官方文档更好地向您解释它,但是您可以看到它,例如,here并且总的来说值得阅读整个页面。