依赖注入、门面、辅助函数怎么选及其使用场景?
从源码中分析,这三者的实现机制以及如何选用
依赖注入
- 通过反射机制获取函数所依赖的对象
- 使用容器解析对象并传递参数
开销
- 主要是反射函数解析的开销
门面
- 通过
getFacadeAccessor
方法获取对象在容器中的名称后使用容器解析对象并缓存 - 通过魔术方法
__callStaic
调用对象方法
开销
- 需要加载门面文件
辅助函数
- 获取静态容器对象
Container::getInstance()
- 解析对象
开销
- 每调用一次就会触发容器的
beforeResolving
事件一次,而其他方式仅触发一次
缺点
- 代码提示不够
如何选?
门面 VS 依赖注入
可以优先选择 依赖注入 以获得最好的代码提示。至于反射开销,你用不用 Laravel
都会去给你做反射解析
门面 VS 辅助函数
这两者之间如何选是最让人纠结的地方,门面主要相较于辅助函数具有更好的 代码提示,而辅助函数的 beforeResolving
事件开销完全取决于你设置了该事件的观察者,在 Laravel 框架里是没有该事件的默认观察者的。所以,在无法使用 依赖注入 的前提下,我个人会优先选择辅助函数。
当然,如果你钟爱 依赖注入,可以试试以下的方式:
use Illuminate\Container\Container;
Container::getInstance()->call([$this, 'method'], ...$parameters);
最后,如果你觉得这个话题有意思,欢迎在下面评论区发表你的看法
本作品采用《CC 协议》,转载必须注明作者和本文链接