Facade
最后更新于:2022-04-02 01:48:21
## 门面(`Facade`)
门面为容器中的类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩展性,你可以为任何的非静态类库定义一个`facade`类。
>[info] 系统已经为大部分核心类库定义了`Facade`,所以你可以通过`Facade`来访问这些系统类,当然也可以为你的应用类库添加静态代理。
下面是一个示例,假如我们定义了一个`app\common\Test`类,里面有一个`hello`动态方法。
~~~
hello('thinkphp'); // 输出 hello,thinkphp
~~~
接下来,我们给这个类定义一个静态代理类`app\facade\Test`(这个类名不一定要和`Test`类一致,但通常为了便于管理,建议保持名称统一)。
~~~
[danger] 说的直白一点,Facade功能可以让类无需实例化而直接进行静态方式调用。
如果没有通过`getFacadeClass`方法显式指定要静态代理的类,可以在调用的时候进行动态绑定:
~~~
'app\common\Test',
'app\facade\Info' => 'app\common\Info',
]);
~~~
## 核心`Facade`类库
系统给内置的常用类库定义了`Facade`类库,包括:
|(动态)类库|Facade类|
|---|---|
| think\App | think\facade\App|
| think\Build | think\facade\Build|
| think\Cache | think\facade\Cache|
| think\Config | think\facade\Config|
| think\Cookie | think\facade\Cookie|
| think\Debug | think\facade\Debug |
| think\Env | think\facade\Env |
| think\Hook | think\facade\Hook|
| think\Lang | think\facade\Lang|
| think\Log | think\facade\Log |
| think\Middleware | think\facade\Middleware |
| think\Request | think\facade\Request |
| think\Response | think\facade\Response|
| think\Route | think\facade\Route |
| think\Session | think\facade\Session|
| think\Url | think\facade\Url |
| think\Validate | think\facade\Validate |
| think\View | think\facade\View |
所以你无需进行实例化就可以很方便的进行方法调用,例如:
~~~
use think\facade\Cache;
Cache::set('name','value');
echo Cache::get('name');
~~~
>[danger] `think\Db`类的实现本来就类似于`Facade`机制,所以不需要再进行静态代理就可以使用静态方法调用(确切的说`Db`类是没有方法的,都是调用的`Query`类的方法)。
在进行依赖注入的时候,请不要使用`Facade`类作为类型约束,而是建议使用原来的动态类,下面是错误的用法:
~~~
[danger] Facade类定义了一个实例化的`instance`方法,如果你的类也有定义的话将会失效。
';