tp5.1 Facade

門面(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',
]);

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章