Facade对应对象 全局唯一还是时刻变化
假面模式Facade的实现基于
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);
}
这个方法。相当于在对象外边封装了一个方便访问的壳子。那这个壳子对应的对象是同一个吗?
重点在于Facade的如下方法:
protected static function resolveFacadeInstance($name)
{
if (is_object($name)) {
return $name;
}
if (isset(static::$resolvedInstance[$name])) {
return static::$resolvedInstance[$name];
}
if (static::$app) {
return static::$resolvedInstance[$name] = static::$app[$name];
}
}
通过壳子调用方法,第一步会去寻找对应的对象,寻找分两种情况:
- 如果getFacadeAccessor返回的是直接new一个对象,那么每次获取到的对象都不一样。
- 如果返回的是一个在AppServiceProvider里面bind、singleton过得abstract,那么这个方法会缓存对象,所以每次获取都是同一个对象。而不论你用的是bind,还singleton。
如何能根据bind、singleton自动判别是应该全局唯一,还是每次变化,可以直接复写这个方法
protected static function resolveFacadeInstance($name)
{
return static::$app[$name];
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: