【问题标题】:Laravel Facades: Are underlying classes instantiated?Laravel Facades:底层类是否已实例化?
【发布时间】:2014-08-15 15:24:07
【问题描述】:

编辑:改写问题

如果您在外观类上调用方法,是否会实例化该类的实际对象以调用该方法,或者是否会在引导应用程序期间实例化该类的对象并且每次都将返回相同的对象(像单身人士)?

我知道当

时,容器绑定的类将被实例化
App::make('class name')
已完成,但由于您不必手动使用 App::make 我不明白类的对象或实例“生活”在哪里?

顺便说一句,我知道 laravel 中的外观与设计模式不同。

【问题讨论】:

  • Laravel “外墙” != GoF 外墙

标签: php laravel


【解决方案1】:

我认为 Dayle Rees 解释得最好:

每个外观都链接到容器中组件的一个实例。 Facade 的静态方法是快捷方式,当被调用时,它们会调用它们在容器中表示的对象的适当公共方法

所以,当一个方法像

Cache::get('key');

被调用,其实是在IoC容器中解析到

$app->make('cache')->get('key');

现在 Cache 实例位于 $app 或主容器内。

编辑:所有类都已注册,不一定在 Laravel 引导期间实例化。

【讨论】:

  • 谢谢!现在,在随后调用该门面时,是否会再次创建该对象的新实例,或者是否该对象现在存在于容器中并且将为所有其他方法调用返回?
  • 由于每个 Facade 都链接到容器中底层类的一个实例,我相信它只会被实例化一次。 Here is Dayle Rees' explanation of the architecture in Codebright
  • 这么说吧,它不会对通过 App::bind 或 App::singleton 绑定底层类(外观调用的类)产生影响,因为它是同一个实例无论如何都会被退回?
  • 我的立场是正确的。我只是更深入地查看了文档,当调用 App::make() 时,它将返回绑定对象的新实例。 App::singleton() 是容器只能有一个类的一个实例的情况。 App::bind() 在 Laravel 的引导程序中用于将类绑定到容器。 link in the docs
  • 但这与外墙有关吗?换句话说,如果类是通过 App::bind('ClassName') 而不是 App::singleton 绑定的,那么底层的门面类将被实例化多次?我问这个是因为我前段时间遇到了另一个问题:stackoverflow.com/questions/25307870/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多