## Facade
Facade为容器中的类提供了一个静态调用接口,相比于传统的静态方法, 带来了更好的可测试性和扩展性,你可以为任何的非静态类库定义一个facade类。
~~~
<?php
namespace app\common;
class Test
{
public function hello($name)
{
return 'hello,' . $name;
}
}
~~~
~~~
<?php
namespace app\facade;
use think\Facade;
class Test extends Facade
{
protected static function getFacadeClass()
{
return 'app\common\Build';
}
}
~~~
只需要定义一个facade类库并且继承`think\Facade`,就可以使用静态方式调用Test类的动态方法,例如:
~~~
use app\facade\Test;
Test::hello('thinkphp');
~~~
就会输出 `hello,thinkphp`。
如果没有通过`getFacadeClass`方法显式指定代理类库,可以在调用的时候进行动态绑定:
~~~
<?php
namespace app\facade;
use think\Facade;
class Test extends Facade
{
}
~~~
~~~
use app\facade\Test;
use think\Facade;
Facade::bind('app\facade\Test','app\common\Test');
Test::hello('thinkphp');
~~~
系统给内置的常用类库定义了Facade类库,包括:
|类库|Facade|
|---|---|
| think\App | think\facade\App|
| 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\Request | think\facade\Request |
| think\Response | think\facade\Reponse|
| think\Route | think\facade\Route |
| think\Session | think\facade\Session|
| think\Url | think\facade\Url |
| think\View | think\facade\View |
所以你无需进行实例化就可以很方便的进行方法调用,例如:
~~~
use think\facade\App;
App::version();
App::getThinkPath();
// 或者使用助手函数
app()->version();
app()->getThinkPath();
~~~
当app助手函数参数为空的时候,表示获取`think\App`对象实例。
App类是一个特殊的容器助手,可以通过app助手函数方便的操作容器,绑定对象实例
~~~
app()->test = new Test;
app()['test'] = new Test;
~~~
获取容器中的对象实例下面用法是等效的:
~~~
app()->test;
app()['test'];
~~~