我注意到,为了创建一个外观类,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]
据我了解$app
是Facade
类的受保护属性,其中包含\Illuminate\Contracts\Foundation\Application
类的实例。
/**
* The application instance being facaded.
*
* @var \Illuminate\Contracts\Foundation\Application
*/
protected static $app;
我的两个问题:
如果Application类没有扩展ArrayObject类,如何将对象用作数组(static::$app[$name]
)?
laravel如何通过仅提供短名称'db'来了解要调用哪个类?
答案 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接口: