門面(Facade
)
門面爲容器中的類提供了一個靜態調用接口,相比於傳統的靜態方法調用, 帶來了更好的可測試性和擴展性,你可以爲任何的非靜態類庫定義一個facade
類。
系統已經爲大部分核心類庫定義了
Facade
,所以你可以通過Facade
來訪問這些系統類,當然也可以爲你的應用類庫添加靜態代理。
說的直白一點,Facade功能可以讓類無需實例化而直接進行靜態方式調用。
下面是一個示例,假如我們定義了一個app\common\Test
類,裏面有一個hello
動態方法。
<?php
namespace app\common;
class Test
{
public function hello($name)
{
return 'hello,' . $name;
}
}
調用hello方法的代碼應該類似於:
$test = new \app\common\Test;
echo $test->hello('thinkphp'); // 輸出 hello,thinkphp
接下來,我們給這個類定義一個靜態代理類app\facade\Test
(這個類名不一定要和Test
類一致,但通常爲了便於管理,建議保持名稱統一)。
<?php
namespace app\facade;
use think\Facade;
class Test extends Facade
{
protected static function getFacadeClass()
{
return 'app\common\Test';
}
}
只要這個類庫繼承think\Facade
,就可以使用靜態方式調用動態類app\common\Test
的動態方法,例如上面的代碼就可以改成:
// 無需進行實例化 直接以靜態方法方式調用hello
echo \app\facade\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');
echo Test::hello('thinkphp');
bind
方法支持批量綁定,因此你可以在應用的公共函數文件中統一進行綁定操作,例如:
Facade::bind([
'app\facade\Test' => 'app\common\Test',
'app\facade\Info' => 'app\common\Info',
]);