Как laravel использует объект как массив в классе Facade - PullRequest
0 голосов
/ 25 мая 2018

Я заметил, что для создания класса фасада laravel предоставляет только имя "db"

framework / 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';
    }
}

Я посмотрел глубже и понял, что этот метод использует предоставленное имя

framework / 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];
}

Я понимаю первый и второй оператор If.

Но у меня есть проблемы с пониманием этого:

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

Как я понял, $app является защищенным свойством класса Facade, которыйсодержит экземпляр класса \Illuminate\Contracts\Foundation\Application.

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

Мои два вопроса:

Как можно использовать объект в качестве массива (static::$app[$name]), если класс приложения этого не делаетрасширяет класс ArrayObject?

Как laravel понимает, какой класс вызывать, предоставляя только короткое имя 'db'?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вы можете посмотреть это, руководство по php и использовать интерфейс ArrayAccess:

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

0 голосов
/ 25 мая 2018

Нажав на источник 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 {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...