我注意到,为了创建外观类,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”来调用哪个类?
点击 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 {
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
937 次 |
| 最近记录: |