在翻看 Laravel 源码时,发现其进行服务注册的时候,大量使用了诸如这样的格式:
1 |
|
以上代码中,Index类为入口,将服务类 ServiceA 和 ServiceB 的实例存放于 容器类 Container 中
这里值得注意的是,服务类在调用容器类 Container 的注册方法 singleton 时,第一个参数是注册的名字,第二个参数是一个匿名函数。
这样子操作,在容器类 Container 的 注册方法 singleton 中,$concrete
的值到底是什么呢?匿名函数的 Closure 实例吗?
1 | ...... |
通过 Debuger 可以看到,$concrete
传入的确实是一个 Closure
类,只不过这个类里头包含两个成员:$this
和 parameter
。其中 $this
的值为 调用类 的 $this。而 parameter
里头的值为 闭包 的 形参。如果使用了 use 语句,还会多一个 static 字段,用于存放 use 的变量

那传入闭包 给 $bindings
有什么作用呢?可能这是一种设计模式吧。。还没怎么了解。。。Laravel 之后的代码中也确实通过类似下面的方式进行了调用。个人认为这样子相当于为服务类新增多一个单独的方法吧。可以这样子调用:
1 | $Container->bindings[ServiceA::class]("xxxx"); |
更多高级点的知识参考下这篇文章
https://www.cnblogs.com/echojson/p/10957362.html
在 Laravel 中的相关操作
Laravel 中,有个叫 Container 的类,用于存放各个实例化的类,方便随时调用。
注册
为了将各个类注册进 Container 中,Container类有一个名为 bind 的方法专门用于将实例化的类存入 bindings 成员变量中。这些实例化的类有很多都是带着匿名函数的。
1 | /** |
调用
调用已注册的 binding 使用的是 Container类 的 build()
1 | public function build($concrete) |