THINKPHP6的门面为容器中的(动态)类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩展性,你可以为任何的非静态类库定义一个facade类。
门面的核心文件是 facade.php ,文件内定义了 facade 类,包含有:
- 待子类重写的方法 getFacadeClass
- 实例化子系统类的方法 createFacade
- 魔术方法__callstatic
facade.php1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php abstract class facade { protected abstract static function getFacadeClass();
protected static function createFacade() { $facadeClass = static::getFacadeClass(); include_once "{$facadeClass}.php"; return new $facadeClass(); } public static function __callstatic($method,$params) { call_user_func_array([static::createFacade(),$method],$params); } }
|
当新增一个子系统类时,同时需要新增一个子系统类的门面类,使得子系统类和 facade 类关联起来。
子系统类tets1.php1 2 3 4 5 6 7 8
| <?php class test1 { public function index($name) { echo "test1,name={$name}"; } }
|
子系统门面类test1facade.php1 2 3 4 5 6 7 8 9
| <?php include_once 'facade.php'; class test1facade extends facade { protected static function getFacadeClass() { return 'test1'; } }
|
客户端不需要直接调用子系统类,而是通过子系统门面类间接调用,并且采用静态调用的方式调用子系统类里的方法。
client.php1 2 3 4 5
| <?php include 'test1facade.php'; include 'test2facade.php'; echo test1facade::index('Jerry'); echo test2facade::index('Page');
|
结果输出
1
| test1,name=Jerrytest2,name=Page
|