写一个简单的 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 协议》,转载必须注明作者和本文链接
推荐文章: