“已解决”/“解决”术语在PHP中实际上是什么意思


What does "resolved" / "resolving" term actually mean in PHP?

我还在学习PHP,我想我不是母语人士并不难理解。

这时,在阅读了大量文档后,我跳入了深水区,所以我打开了Laravel源文件,然后一个又一个文件,试图更好地理解MVC的整个实现如何包括路由,中间件组合成一段高级代码。

我看过很多以前从来不知道的术语,但有些很容易理解,而术语"已解决"和"正在解决"则让我有点头疼。

这到底是什么意思?

文件中文档中的几个示例:

  1. "刷新所有绑定和已解析实例的容器。">

  2. "已解析的类型数组。">

  3. "所有全局解析回调。">

  4. "所有按类类型解决回调后。">

  5. "所有按类类型解决回调后。">

现在我有点困惑,决心和解决在我的语言的简单翻译意味着安定下来,决定,确定,分离,分解,但这些对我来说没有任何意义。

你能澄清一下解析的含义吗? 我觉得一旦我理解了这个词,一切都会更顺利。

所以我打开了Laravel源文件并逐个文件,试图更好地理解MVC的整个实现如何包括路由,中间件组合成一段高级代码。

有一种更好的方法来理解框架源代码。使用调试器。

以任何简单的应用程序示例为例,设置 XDebug 并完成请求处理的整个过程。

首先跳过细节并找出请求处理中涉及哪些类和方法,然后您可以越来越深入。

至少对我来说,这种方式比仅仅阅读源代码要好得多。您将很快找到重要和不重要的内容,并能够专注于基本部分。

现在让我们回到您的resolution问题:

"刷新所有绑定和已解析实例的容器。">

这是源文件 - 照明/容器/容器.php。以及相关文档:https://laravel.com/docs/5.0/container。

实际上,要了解源代码,您首先需要了解文档中的概念。在这种情况下,他们谈论的是依赖注入容器,您需要了解它的工作原理:

  • 我们定义依赖关系,例如public function __construct(FooBar $dependency)
  • 我们不
  • 直接传递这些依赖项:我们不做$foo = new FooBar; $object = new MyObject($foo);;相反,我们配置Laravel的服务容器,它为我们resolves这些依赖项
  • 所以这里的resolution是当我们问服务容器:"请给我们FooBar"的过程,它通过它的内部注册表并找出(解决(实际应该创建什么对象

我们为什么要这样做?因为我们不想对依赖项进行硬编码。

例如,你可以有一个依赖于Mailer的类。在生产环境中,您希望SMTPMailerMailer,并且在测试时,您希望使用将电子邮件写入文件的MockMailer

因此,您将 Laravel 服务容器配置为在本地解析MockMailer Mailer,并将其解析为生产SMTPMailer

                                  ---  resolution process ------
                                  |                            |
                                     ---------------------
                                     |                   |         ----------------
--------------------------------     |     Container     |    ---->|  SMTPMailer  |
| MyObject                     |     |                   |   /     ----------------
|                              |     |   | internal |    |  /
| __construct(Mailer $mailer) -|---->|   | registry |-------       ----------------
|                              |     |   |          |    |         |  MockMailer  |
-------------------------------      |                   |         ----------------
                                     ---------------------

MyObject中,我们定义了一些抽象的Mailer依赖关系,然后由Container解析为SMTPMailerMockMailer,具体取决于配置。

查看Laravel文档中的更多使用示例和解释。

"已解析的类型数组。">

这是我们之前请求的类型(如FooBar(的数组,这些类型已经解析(我们已经知道哪些实际的类映射到FooBar(。

"所有全局解析回调。">

这是一个用于解析依赖关系的回调数组 - 这是 Laravel 内部注册表的一部分。

"所有按类类型解决回调后。">

这些是在解析完成时调用的回调。这可能与文档中的本节有关 - 容器事件。