门面(Facade
)
门面为容器中的类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩展性,你可以为任何的非静态类库定义一个facade
类。
例:
1.定义一个Test
类 –> 有一个hello
动态方法
0 1 2 3 4 5 6 7 8 |
namespace app\common; class Test { public function hello($name) { return 'hello,' . $name; } } |
2.接下来,我们给这个类定义一个静态代理类app\facade\Test
(这个类名不一定要和Test类一致,但通常为了便于管理,建议保持名称统一)。
0 1 2 3 4 5 6 7 8 9 10 |
<?php namespace app\facade; use think\Facade; class Test extends Facade { protected static function getFacadeClass() { return 'app\common\Test'; } } |
3.只要这个类库继承think\Facade
,就可以使用静态方式调用动态类app\common\Test
的动态方法。
// 无需进行实例化 直接以静态方法方式调用hello
echo \app\facade\Test::hello('thinkphp');
个人代码举例:
在项目应用模块下创建一个facade
文件夹,
用工厂模式定义静态代理类 ModelFactory.php
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php namespace app\facade; use think\Facade; /** * Class ModelFactory * @package app\facade */ class ModelFactory extends Facade { private static $ModelName; public function __construct($ModelName) { self::$ModelName = $ModelName; } protected static function getFacadeClass() { $ModelName = 'app\common\model\\'.self::$ModelName; return $ModelName; } } |
在 tp5 common.php
文件中创建一个模型工厂方法M()
。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/** * 模型工厂 * @param $ModelName * @return ModelFactory */ function M($ModelName) { try{ $Model = new ModelFactory($ModelName); return $Model; }catch (Exception $ex){ Log::record("== 实例化模型错误 ==", 'DEBUG'); Log::record($ex->getMessage(), 'DEBUG'); exit('实例化模型错误'); } } |
调用示例:
0 1 2 |
M('RoleModel')::setRoleStatus(); //即M()中可以传入任何类名,即可生成该类的静态代理类。 //此例生成了RoleModel类的静态代理类,调用了其setRoleStatus方法。 |