依赖注入、门面、辅助函数怎么选及其使用场景?

从源码中分析,这三者的实现机制以及如何选用

依赖注入

  1. 通过反射机制获取函数所依赖的对象
  2. 使用容器解析对象并传递参数

开销

  1. 主要是反射函数解析的开销

门面

  1. 通过 getFacadeAccessor 方法获取对象在容器中的名称后使用容器解析对象并缓存
  2. 通过魔术方法 __callStaic 调用对象方法

开销

  1. 需要加载门面文件

辅助函数

  1. 获取静态容器对象 Container::getInstance()
  2. 解析对象

开销

  1. 每调用一次就会触发容器的 beforeResolving 事件一次,而其他方式仅触发一次

缺点

  1. 代码提示不够

如何选?

门面 VS 依赖注入

可以优先选择 依赖注入 以获得最好的代码提示。至于反射开销,你用不用 Laravel 都会去给你做反射解析

门面 VS 辅助函数

这两者之间如何选是最让人纠结的地方,门面主要相较于辅助函数具有更好的 代码提示,而辅助函数的 beforeResolving 事件开销完全取决于你设置了该事件的观察者,在 Laravel 框架里是没有该事件的默认观察者的。所以,在无法使用 依赖注入 的前提下,我个人会优先选择辅助函数。

当然,如果你钟爱 依赖注入,可以试试以下的方式:

use Illuminate\Container\Container;

Container::getInstance()->call([$this, 'method'], ...$parameters);

:star2:最后,如果你觉得这个话题有意思,欢迎在下面评论区发表你的看法 :star2:

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!