Laravel - Получи инстансы ценностей через фасады - PullRequest
0 голосов
/ 26 декабря 2018

In Illuminate\Support\Facades\Facade abstract In метод

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

static::$app является экземпляром Application.И static::$app[$name] это как значение доступа array, и я не понимаю, что за техника здесь?

ex: static::$app['router'] возвращает экземпляр Router.Кажется, что получить значения protected $instances в Illuminate\Container\Container

Я думаю, что это как пример?но получил FATAL ERROR Uncaught Error: Cannot use object of type Foo as array

class Foo
{
    public $bar = 'barValue';
}

$foo = new Foo();
echo $foo['bar'];

1 Ответ

0 голосов
/ 31 декабря 2018

Если вы проверите API Illuminate \ Container \ Container , вы заметите, что он реализует ArrayAccess и, следовательно, следующие методы.

  1. offsetExists()
  2. offsetGet ()
  3. offsetSet ()
  4. offsetUnset ()

ArrayAccess позволяет получать доступ к объектам в виде массивов.Вот очень упрощенный пример контейнера.

<?php

class Container implements ArrayAccess {

    private $items = array();

    public function __construct() {
        $this->items = [
            'one'   => 1,
            'two'   => 2,
            'three' => 3,
        ];
    }

    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->items[] = $value;
        } else {
            $this->items[$offset] = $value;
        }
    }

    public function offsetExists($offset) {
        return isset($this->items[$offset]);
    }

    public function offsetUnset($offset) {
        unset($this->items[$offset]);
    }

    public function offsetGet($offset) {
        return isset($this->items[$offset]) ? $this->items[$offset] : null;
    }
}

$container = new Container();

echo $container['one']; // outputs 1

$container['four'] = 4; // adds 4 to $items. 

echo $container['four']; // outputs 4

Как видите, вы можете обращаться к объекту контейнера как к массиву, поскольку он реализует ArrayAccess.

Также не имеет значения, является ли свойство items общедоступным.В любом случае реализация ArrayAccess означает, что это позволит нам получить эти значения, как если бы они были в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...