写一个简单的 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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
68
粉丝
17
喜欢
141
收藏
119
排名:130
访问:7.5 万
私信
所有博文
社区赞助商