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

时间:2018-05-25 13:48:37

标签: php laravel

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

框架/ SRC /照亮/支持/墙面/ db.php中

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

我看得更深,并发现此方法使用提供的名称

框架/ SRC /照亮/支持/墙面/ 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];
}

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

但我对理解这一点有疑问:

return static::$resolvedInstance[$name] = static::$app[$name]

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

/**
     * The application instance being facaded.
     *
     * @var \Illuminate\Contracts\Foundation\Application
     */
    protected static $app;

我的两个问题:

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

laravel如何通过仅提供短名称'db'来了解要调用哪个类?

2 个答案:

答案 0 :(得分:4)

点击Laravel源代码,我发现了这一点。如您所见,ApplicationContract(您问题中的private 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 {

答案 1 :(得分:0)

你可以看看这个,php手册并使用ArrayAccess接口:

http://php.net/manual/en/class.arrayaccess.php