## 容器注入
容器,也称服务容器,简称和(IOC),深入理解其实应是控制反转。
一言蔽之,即最大化简化外部对象的调用,即插即用,最终实现代吗的高内聚低耦合。
步骤:
1. 创建容器,将类之间的实例化过程绑定到容器中(不局限于类,也可以是接口或者闭包等)
2. 服务注册,将可能用到的工具类绑定到容器当中。
3. 容器依赖:也就是一依赖注入容器,调用工作类是直接传入容器对象,而工具类的实例化由容器完成。
> 总结,改方式就是为了依赖实例们提供一个容器,它担任全局的注册树,可以方便的通过它来获取依赖的实例,提高代码可用性。
## Facade 外观模式
外观模式,也就是门面模式
1. 一言蔽之,就是将操作进行封装,对外提供统一接口
2. 通过容器可以很好的将不同的类封装起来,将不同的操作统一到一块儿
3. 两者结合就能够实现统一的接口
实例
<?php /** * 工具类 */ class Db { public function connect() { return '数据库连接成功<br>'; } } class Validate { //数据验证 public function check() { return '数据验证成功<br>'; } } class View { //内容输出 public function display() { return '用户登录成功'; } } /** * 创建容器类 */ class Container { protected $instances; public function bind($abstract, $process) { if ($process instanceof Closure) { $this->instances[$abstract] = $process; } } public function make($abstract, $params = []) { array_unshift($params, $this); return call_user_func_array($this->instances[$abstract],$params); } } /** * 工作类 */ class User { public function login(Container $container) { echo $container->make('db')->connect(); echo $container->make('validate')->check(); echo $container->make('view')->display(); } } /** * 服务绑定 */ $container = new Container(); // 注册当前工作类 $container->bind('user', function ($container, $moduleName) { return new User($container->make($moduleName)); }); // 注册工具类 $container->bind('db', function($container) { return new Db(); }); $container->bind('validate', function($container) { return new Validate(); }); $container->bind('view', function($container) { return new View(); }); // var_dump($container); $user = new User(); echo $user->login($container); /** * facaded */ class Facade { protected static $container = null; public static function initialize(Container $container) { static::$container = $container; } public static function connect() { return static::$container->make('db')->connect(); } public static function check() { return static::$container->make('validate')->check(); } public static function display() { return static::$container->make('view')->display(); } } Facade::initialize($container); echo '<hr>'; echo Facade::connect(); echo Facade::check(); echo Facade::display();
运行实例 »
点击 "运行实例" 按钮查看在线实例