TP5的Facade有什么好处?

y_w_x_k 2020-03-16 09:17:34
难道就是让原本非静态的方法,用静态调用,就比原来优雅一点就没了吗?
...全文
423 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
y_w_x_k 2020-06-13
  • 打赏
  • 举报
回复 1
引用 1 楼 小白yige 的回复:
如果不看源码,仅仅从使用上来说也只能感到也就这点优点。可以看到Facade基类,很多类都继承了这个,比如route,request,config等等。可以看到这些子类里面实现很简单,子类做的工作很简单就是重写了父类getFacadeClass方法,在这里返回了一个字符串,这个字符串是容器类里面绑定类的标识。之所以可以通过静态调用是这下面的代码起的作用


   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就可以了,因为对于外面调用的地方他们不关心实际调用的是什么,只要关心方法名和返回结果就好了
有点了解了,回答的很详细,感谢
小白yige 2020-06-12
  • 打赏
  • 举报
回复 1
如果不看源码,仅仅从使用上来说也只能感到也就这点优点。可以看到Facade基类,很多类都继承了这个,比如route,request,config等等。可以看到这些子类里面实现很简单,子类做的工作很简单就是重写了父类getFacadeClass方法,在这里返回了一个字符串,这个字符串是容器类里面绑定类的标识。之所以可以通过静态调用是这下面的代码起的作用


   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就可以了,因为对于外面调用的地方他们不关心实际调用的是什么,只要关心方法名和返回结果就好了

4,250

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧