我对 laravel 在 IOC 容器和外观方面必须提供的所有好东西感到有点困惑。由于我不是经验丰富的程序员,因此学习起来会不知所措。
我想知道,这两个例子有什么区别:
“Foo”的门面并通过
App::bind()
在容器中注册“Foo”的外观并通过
App::singleton()
在容器中注册
在我的最佳理解中 Foo::method()
将被重写为 $app->make['foo']->method()
所以在第一个例子中 Foo
的多个实例将被创建,因为它在第二个例子中通过 App::singleton()
绑定,每次调用该对象上的方法时,将返回 Foo
的相同实例。
如果这个问题的答案很明显,我很抱歉,但我找不到关于此事的任何确认,也没有任何地方清楚地解释这一点。
原文由 Luuk Van Dongen 发布,翻译遵循 CC BY-SA 4.0 许可协议
就是这样。
一个非常简单的证明是测试行为。由于 Laravel 应用程序简单地扩展了
Illuminate\Container\Container
,我们将只使用容器(在我的例子中,我什至只将容器作为依赖项添加到我的 composer.json 中)进行测试。结果符合预期:
Bind: test vs. test2
Singleton: test2 vs. test2
可能是一个肮脏的证据,但它确实是一个。
所有的魔法都在于
Container::make
方法。如果绑定注册为共享(即单例),则返回类实例,否则每次都返回一个新实例。来源: https ://github.com/laravel/framework/blob/4.2/src/Illuminate/Container/Container.php#L442
顺便说一句,
Container::singleton
与Container::bind
相同,第三个参数设置为true。