写一个简单的 Facade 示例

首先在 API 命名空间里写个 DB 类

namespace API{
    class DB{
        public function __construct(){
            echo __CLASS__.'::'.__FUNCTION__.'<br><br>';
        }
        public function Write($str){
            echo __CLASS__.'::'.__FUNCTION__."($str)<br><br>";
        }
        public function Read($str){
            echo __CLASS__.'::'.__FUNCTION__."($str)<br><br>";
        }
        public function __call($method, $str){
            echo "根本就没有这个方法: $method($str[0]) <br><br>";
        }
    }
}

接着添加如下这段代码

namespace {
    abstract class Facade{
        public static function getInstance($classname){
            echo __CLASS__.'::'.__FUNCTION__.'实例化对象<br>';
            return new $classname();
        }

        abstract public static function getFacadeAccessor();

        public static function __callstatic($method,$arg){
            echo __CLASS__.'::'.__FUNCTION__.' 静态魔术方法被触发<br>';
            $accessor= static::getFacadeAccessor();
            $instance= static::getInstance($accessor);
            return call_user_func_array(array($instance, $method), $arg);
        }
    }

    class DBFacade extends Facade{
        public static function getFacadeAccessor(){
            echo __CLASS__.'::'.__FUNCTION__.',返回值='.API\DB::class.'<br>';
            return API\DB::class;
        }
    }
}

再添加实际调用代码

namespace {
    DBFacade::Write('张三');
    DBFacade::Read('李四');
    DBFacade::Ohno(2);
}

运行效果如截图
写一个简单的 Facade 示例
本例涉及基本知识点如下
1、命名空间的大括号写法;
2、魔术常量__CLASS____FUNCTION__的用法;
3、魔术方法__call() 的用法;
4、静态魔术方法__callstatic() 的用法;
5、call_user_func_array() 的用法;
6、延迟静态绑定 static:: 关键字的用法(重点)

就本例而言,static::getFacadeAccessor 首先在子类中查找 getFacadeAccessor () 方法,并且找到了,于是调用子类方法;对于 static::getInstance 也是同理,但是子类中并没有这个方法,于是调用了当前类的 getInstance () 方法。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
未填写
文章
68
粉丝
17
喜欢
141
收藏
119
排名:130
访问:7.5 万
私信
所有博文
社区赞助商