Laravel 4 - 容器类:共享函数和闭包逻辑

2024-03-25

我对这里讨论的问题有一个后续问题:Laravel 核心方法混乱 https://stackoverflow.com/questions/15758936/laravel-core-method-confusion/17295616#17295616

我和driechel(上面问题的作者)之前的情况一样,目前正在习惯 Laravel 4 FW 并检查核心。尽管已经给出了准确的答案,但我仍然不明白其中的逻辑以及幕后发生的事情。所以我非常感谢进一步的解释。 我知道这可能是重复的,但由于我还不能发表评论,我会尝试提出一个新问题。希望这样就可以了。

从这篇文章开始,我一直在从另一个角度看待这个问题:http://blog.joynag.net/2013/05/facades-in-laravel-4-and-static-methods-resolution/ http://blog.joynag.net/2013/05/facades-in-laravel-4-and-static-methods-resolution/

检查通话时File:get()我终于到达了容器类的共享功能用这个实际参数调用share(function() { return new Filesystem; }.

我只是不明白的是使用$container。特别是在闭包内第二次出现时:

$object = $closure($container);

您能再澄清一下吗?为什么是$container此处作为参数传递,其中实际包含什么?据我所理解$closure此时持有并执行function() { return new Filesystem; }没有输入参数。

我搞不清楚了。现在连续两天研究这个和 PHP 匿名函数/闭包,但仍然无法弄清楚。我既不明白语法$closure($container)这里也没有逻辑。


作为参考,这是share方法@v4.0.5 https://github.com/laravel/framework/blob/v4.0.5/src/Illuminate/Container/Container.php#L126.

那么,这里发生了什么。我将分几步进行解释。

调用分享方法

正如您所指出的,此方法是从服务提供商调用的。所以FilesystemServiceProvider调用这个方法,看起来像这样:

$this->app['files'] = $this->app->share(function() { return new Filesystem; });

它正在分配return这个的值share方法到容器中的绑定。简而言之,该返回值将是新的Filesystem闭包中返回的实例。

那么共享有什么作用呢?

The share方法只是在 IoC 容器中定义单例的另一种方式。所有这些一开始可能有点令人生畏。基本上,Laravel 本身就是一个 IoC 容器。所有类都作为实例绑定在容器上。有时这些实例应该是same每次调用时都有实例。

如果您在 GitHub 上查看上面的引用方法,您会注意到闭包内部定义了一个静态变量。然后它检查该变量是否为 null,如果是,则解析闭包(这是返回我们新的闭包)Filesystem实例)。然后它只是返回变量。

现在,下次您使用时File::get()它不需要实例化Filesystem再次类,因为它已经被实例化并存储在静态中$object多变的。所以它只是将相同的对象返回给您。

So!真的,你可以替换$this->app['files']与此一致,它仍然有效。

$this->app->instance('files', new Filesystem);

99% 的服务实际使用share方法,因为在闭包内工作允许使用更复杂的依赖关系实例化对象。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 4 - 容器类:共享函数和闭包逻辑 的相关文章

  • 增加内存限制时出现奇怪的错误

    我使用的是共享托管环境 PHP 的默认内存限制是 32M 我在 Concrete5 设置方面遇到一些问题 当我尝试登录 Concrete5 的管理面板时 出现内存限制错误Allowed memory size of 33554432 byt
  • jquery ajax加载后丢失CSS

    大家知道如何解决 load Ajax 请求后的 css 问题吗 例如 如果我想从网页加载 DIV 在我的 Ajax 请求之后 container load path to div div id 我丢失了与该 div 关联的所有 css 和脚
  • Php 转换 GMT 格式的时间

    我有这个字符串2012 06 27 16 17 06我想将其转换为 GMT 格式 我怎样才能做到这一点 多谢 Use gmdate http php net manual en function gmdate php 使用以下命令将当前日期
  • 如何使用 php 从字符串中提取日期

    我需要从字符串中提取日期 下面是我的代码和字符串 str Updated status to Masters Software Engineering Enrolled Documents to Send on 03 06 2014 14
  • 为什么我的浮点数大于 1 时在 MYSQL 中存储为 .9999?

    我将进程时间作为 float 4 4 存储在 MySQL 数据库中 start time microtime TRUE things happen in my script end time microtime TRUE process t
  • CakePHP - 选择性 SSL

    如何对网站的某些部分强制使用 HTTPS 例如登录页面或注册页面 并使用 HTTP 来完成网站的其余部分 我最喜欢的强制转换为 https 的方法是将其作为 php 脚本中的第一件事 它可以在 Joomla 中运行 也可以在 CakePHP
  • php 检查文件是否存在于外部域中(从子域访问)

    我有一个网站http www reelfilmlocations co uk http www reelfilmlocations co uk 上述网站有一个管理区域 其中上传图像并在 uploads images 目录的子文件夹中创建不同
  • Laravel:使用 Faker 播种多个独特的列

    介绍 怎么样 伙计们 我有一个关于模型工厂和多个独特列的问题 背景 我有一个名为 Image 的模型 该模型将语言支持存储在单独的模型中 图片文字 图片文字 has an image id栏 语言栏和文本栏 图片文字有一个约束MySQL那个
  • 动态创建和下载Doc文件

    因此 我尝试动态创建 doc 文件并让用户在单击按钮时下载该文件 这些是我找到的用于下载文件的标头 header Content Description File Transfer header Content Type applicati
  • PHP中的反转数组

    array 7 0 gt array 2 id gt string 1 9 roi gt float 0 1 gt array 2 id gt string 1 1 roi gt float 0 2 gt array 2 id gt str
  • 如何解决 注意:未定义索引:第 21 行 C:\xampp\htdocs\invmgt\manufactured_goods\change.php 中的 id [重复]

    这个问题在这里已经有答案了 我的 PHP 代码有一个问题 显示 注意 未定义的索引 我确信它非常简单 因为我是初学者 所以我不太清楚到底出了什么问题 所以请帮助我 这是代码
  • 将 PayPal 返回 URL 设置为 localhost

    我正在尝试集成 Paypal 并且在此过程中使用沙箱 我按照以下问题中接受的答案的步骤进行操作 设置 PayPal 返回 URL 并使其自动返回 https stackoverflow com questions 7642895 setti
  • 如何检查 $row['column_name'] 是否返回空 php mysql

    我有一个带有列的表格 id name phone describe 当我从这个表中获取值时 我正在使用 row mysql fetch array query 现在我想检查是否 row describe 返回空值 如何查看php 您可以使用
  • PHP括号少IF条件不接受多个语句

    我从来都不喜欢控制结构中的括号 直到今天我才意识到它如何只接受括号内的一条语句而不是 if 条件 如果我有多个语句 它会抛出语法错误 这是 PHP 的工作方式还是我的 IDE 有问题 显然错误很明显 但我只是想确保这是正常的 如果您有任何其
  • 为什么 PHPUnit 将一些右大括号显示为未被覆盖?

    我正在使用 PHPUnit 3 6 7 PHP CodeCoverage 1 1 1 和 Xdebug 2 1 2 当我让 PHPUnit 将代码覆盖率统计信息写入 clover 样式的 XML 文件时 它偶尔会显示一个右花括号 表示测试未
  • PHP 的 mb_internal_encoding 实际上是做什么的?

    根据 PHP 网站 http www php net manual en function mb internal encoding php它这样做 coding 是用于 HTTP 输入的字符编码名称 字符编码转换 HTTP输出字符编码 转
  • Microsoft VS Code:当我尝试启动程序时,出现错误“spawn php ENOENT”

    我正在尝试在 Microsoft VS Code 上运行 PHP 代码 当我单击启动时 唯一发生的事情是调试控制台中出现错误 生成 php ENOENT 为了解决这个问题 我将 XDebug 的 dll 文件放入 ext 文件夹中 我将 p
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • 计算特定产品类别的购物车商品数量

    我试图仅从 WooCommerce 中的特定产品类别获取购物车中的商品数量 我正在为一家酒厂做一个网站 它有酒精和非酒精产品 所有葡萄酒都属于 葡萄酒 主类别或类别 ID 34 其下有许多子类别和产品 对于属于此类别的任何商品 我需要知道此

随机推荐