4,250
社区成员




protected static function createFacade($class = '', $args = [], $newInstance = false)
{
$class = $class ?: static::class;
$facadeClass = static::getFacadeClass();
if ($facadeClass) {
$class = $facadeClass;
} elseif (isset(self::$bind[$class])) {
$class = self::$bind[$class];
}
if (static::$alwaysNewInstance) {
$newInstance = true;
}
return Container::getInstance()->make($class, $args, $newInstance);
}
// 调用实际类的方法
public static function __callStatic($method, $params)
{
return call_user_func_array([static::createFacade(), $method], $params);
}
以Config::get来说,之所以编辑器会正常提示得益于think\facade\Config上面的方法注释,但是调用的实际调用的是上面的__callStatic.这个方法又调用了上面的createFacade,你会发现它是从容器类里面获得的,容器类里面的对象第一次创建后就绑定了,下次就可以直接获取,这就是优点,避免了一个类调用的时候反复创建,很多类没有必要反复实例化所以App.php启动的时候就在第一次实例化的时候放容器里面了,实现了全局共享。另一个优点:如果以前对于config来说,需要倒出use config的命名空间,然后new config(),然后调用,假设config不让用了,需要实例化自己创建的config类,如果不用门面模式,你需要把代码全局搜索替换,如果用facade,你只需要重写 getFacadeClass方法,改变里面的返回字符串为自己定义的config就可以了,因为对于外面调用的地方他们不关心实际调用的是什么,只要关心方法名和返回结果就好了