写一个简单的 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);
}运行效果如截图
本例涉及基本知识点如下
1、命名空间的大括号写法;
2、魔术常量__CLASS__和__FUNCTION__的用法;
3、魔术方法__call()的用法;
4、静态魔术方法__callstatic()的用法;
5、call_user_func_array()的用法;
6、延迟静态绑定static::关键字的用法(重点)
就本例而言,static::getFacadeAccessor首先在子类中查找getFacadeAccessor()方法,并且找到了,于是调用子类方法;对于static::getInstance也是同理,但是子类中并没有这个方法,于是调用了当前类的getInstance()方法。
本作品采用《CC 协议》,转载必须注明作者和本文链接
 
           zhaiduting 的个人博客
 zhaiduting 的个人博客
         
             
             
             
             
             
                     
                     
           
           关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: