Я заметил, что для создания класса фасада 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'?