讨论数量:
没有。可以把构造函数注入当作少了这个步骤
new someClass()
@Z_Laravel 手动声明变量类型
/**
* @var WalletService
*/
protected $wallet;
public function a()
{
$this->wallet = app(WalletService::class);
$this->wallet->getMoney();
// 或者
/** @var WalletService $wallet */
$wallet = app(WalletService::class);
$wallet->getMoney();
}
用app助手函数它实际是去容器里找这个类的实例,但如果我没有将实例放到容器里,这个从容器里找实例的动作不是多余的吗?
app 可以通过依赖注入帮你解决类的依赖问题
// 假如你实例化 A 时需要传入 B 和 C 的实例,你需要这样写
$b = new B();
$c = new C();
$a = new A($b, $c);
// 使用容器解析 A 的实例,只需这样写
$a = app(A::class);
// 作业:假如 B 和 C 在实例化时依赖于 D 和 E,你要如何手动实例化呢?
且我在一次请求里用多次助手实例同一个类的情况,它并不会自动将实例放到容器里,意味着每次都要重复在容器找实例的动作,那不如直接new。
app 可以通过绑定单例帮你共享实例
// 假如你需要将一个类变为单例,你需要这样写
// 这里我就不写了
// 使用容器将一个类绑定为单例,只需这样写
app()->singleton(A::class);
$a1 = app(A::class);
$a2 = app(A::class);
dd($a1 === $a2); // true
除了代码规范要求外,我想不到用app比直接new有什么优势?
app 的其他功能参阅文档 服务容器, app 和 new 是两码事儿,没有孰优孰劣之分。
@Z_Laravel 手动声明变量类型