Laravel门面实现原理
环境
Laravel 5.4
原理
在Laravel中,门面为应用服务容器中绑定的类提供了一个“静态”接口,使得我们可以不用new
这些类出来,就可以直接通过静态接口调用这些类中的方法。
下面我们先看看一个门面类是怎么定义的:
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class Player extends Facade
{
protected static function getFacadeAccessor() {
return 'player';
}
}
门面类都继承自Illuminate\Support\Facades\Facade
父类,这个父类中有一个魔术方法:
/**
* Handle dynamic, static calls to the object.
*
* @param string $method
* @param array $args
* @return mixed
*
* @throws \RuntimeException
*/
public static function __callStatic($method, $args)
{
$instance = static::getFacadeRoot();
if (! $instance) {
throw new RuntimeException('A facade root has not been set.');
}
return $instance->$method(...$args);
}
当我们静态调用一个不存在的方法时,例如Player::playOneSong()
,这个魔术方法就会被调用。它通过getFacadeRoot()
方法创建出一个对象,然后在这个对象上真正执行我们的方法。
再看看getFacadeRoot()
方法:
/**
* Get the root object behind the facade.
*
* @return mixed
*/
public static function getFacadeRoot()
{
return static::resolveFacadeInstance(static::getFacadeAccessor());
}
这里通过我们自定义门面类中的getFacadeAccessor
方法,获取到一个service_id(暂且这么叫吧),然后传给resolveFacadeInstance
方法。
再往下看resolveFacadeInstance
方法:
/**
* Resolve the facade root instance from the container.
*
* @param string|object $name
* @return mixed
*/
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[$name]
从服务容器中获取 key 为name
的对象,服务容器会帮我们实例化出对应的对象(前提是已经绑定好)。
服务容器
$app
是一个对象,但它实现了ArrayAccess
接口,所以可以用这种数组的方式访问。
获取到对象后,放入到static::$resolvedInstance
静态变量中,这样下次再获取相同对象时,就不用重复实例化了。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgaekbj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24