THINKPHP6如何实现门面模式

Published on:

THINKPHP6的门面为容器中的(动态)类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩展性,你可以为任何的非静态类库定义一个facade类。

门面的核心文件是 facade.php ,文件内定义了 facade 类,包含有:

  • 待子类重写的方法 getFacadeClass
  • 实例化子系统类的方法 createFacade
  • 魔术方法__callstatic
facade.php
1
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.php
1
2
3
4
5
6
7
8
<?php
class test1
{
public function index($name)
{
echo "test1,name={$name}";
}
}
子系统门面类test1facade.php
1
2
3
4
5
6
7
8
9
<?php
include_once 'facade.php';
class test1facade extends facade
{
protected static function getFacadeClass()
{
return 'test1';
}
}

客户端不需要直接调用子系统类,而是通过子系统门面类间接调用,并且采用静态调用的方式调用子系统类里的方法。

client.php
1
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