门面
门面(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
。
说的直白一点,Facade功能可以让类无需实例化而直接进行静态方式调用。
~~~~~~~~~~~~~~
这个类定义一个静态代理类,(这个类名不一定要和动态类一致,但通常为了便于管理,建议保持名称统一)。
<?php
namespace app\common\facade;use think\Facade;class User extends Facade
{protected static function getFacadeClass(){return 'app\common\service\User';}
}
只要这个类库继承think\Facade
,就可以使用静态方式调用动态类的动态方法,代码如下:
// 无需进行实例化 直接以静态方法方式调用login// 校验用户名密码$result = \app\common\facade\User::login($username, $password);