欢迎来到Introzo百科
Introzo百科
PHPLaravel门面的实现原理详解
目录
- 环境
- 原理
环境
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父类,这个父类中有一个魔术方法:
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()方法:
public static function getFacadeRoot()
{
return static::resolveFacadeInstance(static::getFacadeAccessor());
}
这里通过我们自定义门面类中的getFacadeAccessor方法,获取到一个service_id(暂且这么叫吧),然后传给resolveFacadeInstance方法。
再往下看resolveFacadeInstance方法:
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静态变量中,这样下次再获取相同对象时,就不用重复实例化了。
到此这篇关于php Laravel门面的实现原理详解的文章就介绍到这了,更多相关PHP Laravel门面内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
相关文章
- 10-06 英超pfa最佳阵容(pfa英超最佳阵容是官方的)
- 10-06 易建联cba(易建联cba首秀完整视频)
- 10-06 今天世界杯有多少场比赛(今天世界杯有多少场比赛一一
- 10-06 优酷怎么投屏到电视上,优酷怎么将电视投屏到电视上?
- 10-06 优酷怎么关闭弹幕,优酷在那里关闭弹幕?
- 10-06 优酷怎么关闭历史记录,优酷怎么在历史记录过滤短视频
- 10-06 抖音火山版和抖音的区别 抖音怎么授权抖音火山版
- 10-06 抖音月付怎样分期付款 抖音商城怎么设置收货地址
- 10-06 抖音ai绘画怎么弄,抖音如何拍摄ai绘画特效?
- 10-06 据透露,哈登与76人队总裁的关系已经破裂,前者还想
- 10-06 官方:火箭新秀惠特莫尔当选2023年夏季联赛MVP
- 10-06 利拉德交易的一部分?约维奇:NBA 是一门生意
- 10-06 苏亚雷斯为什么喜欢咬人(为什么苏亚雷斯喜欢咬人)
- 10-06 2013年斯诺克世锦赛总决赛(2013年斯诺克世锦
- 10-06 阿根廷女足第一点(阿根廷女足)
- 10-06 尤文图斯和皇马都在关注罗马年轻中场卡佩罗认为他是意
- 10-06 尤文图斯官方确认今年夏天将前往中国热身!对阵国际米
- 10-06 AC米兰想从利物浦挖走洛夫伦,罗马和那不勒斯也想—
- 10-06 乌戈
- 10-06 汉密尔顿:活塞阵容非常好,年轻球员需要时间成长
- 最近发表