laravel 如何在 Facade 类中使用对象作为数组

Joh*_*ent 4 php laravel

我注意到,为了创建外观类,laravel 仅提供名称“db”

框架/src/Illuminate/Support/Facades/DB.php

class DB extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'db';
    }
}
Run Code Online (Sandbox Code Playgroud)

我更深入地研究并发现这个方法使用提供的名称

框架/src/Illuminate/Support/Facades/Facade.php

protected static function resolveFacadeInstance($name)
{
    if (is_object($name)) {
        return $name;
    }
    if (isset(static::$resolvedInstance[$name])) {
        return static::$resolvedInstance[$name];
    }
    return static::$resolvedInstance[$name] = static::$app[$name];
}
Run Code Online (Sandbox Code Playgroud)

我理解第一个和第二个 If 语句。

但我在理解这一点时遇到了问题:

return static::$resolvedInstance[$name] = static::$app[$name]
Run Code Online (Sandbox Code Playgroud)

据我了解,这$app是类的受保护属性Facade,其中包含类的实例\Illuminate\Contracts\Foundation\Application

/**
     * The application instance being facaded.
     *
     * @var \Illuminate\Contracts\Foundation\Application
     */
    protected static $app;
Run Code Online (Sandbox Code Playgroud)

我的两个问题:

static::$app[$name]如果 Application 类没有扩展 ArrayObject 类,如何将对象用作 array( ) ?

laravel 如何理解仅提供短名称“db”来调用哪个类?

Loe*_*oek 5

点击 Laravel 源代码,我发现了这个。如您所见,ApplicationContractprivate static $app来自您的问题)是由 实现的Application。这又派生自Container,它实现了 PHP 核心ArrayAccess接口。仔细实现整个链最终可以Applicatin像数组一样进行访问。

事实证明,它归结为良好的面向对象编程:)

// Illuminate/Foundation/Application.php
class Application extends Container implements ApplicationContract, HttpKernelInterface
                          ^^^^^^^^^            ^-> the private static $app in your question.

// Illuminate/Container/Container.php
class Container implements ArrayAccess, ContainerContract
                           ^^^^^^^^^^^

// PHP core ArrayAccess documentation
/**
 * Interface to provide accessing objects as arrays.
 * @link http://php.net/manual/en/class.arrayaccess.php
 */
interface ArrayAccess {
Run Code Online (Sandbox Code Playgroud)

  • 噢..是吗?这实际上只是 OOP 基础知识,例如实现接口和继承类。“Application”派生自“Container”,它实现了“ArrayAccess”。我也不知道 Container 实际上是做什么的,也不知道 ArrayAccess 是如何实现的,但是 OOP 和文档告诉我,这就是 Application 作为对象进行访问的方式。不过我会更新一些解释。 (2认同)