咱们已经通过依赖注入的方法解决了对象之间的藕合问题,但仍未从根本上解决问题;
下面我们通过容器技术的讲解,让大家明白这种更加合理优秀的解决方案。
容器其实是一个盒子,里面可以装任何服务资源:类,类的实例,闭包,函数等,不仅可以将被调用者放在里面,
甚至主调用对象也可以放在里面。所以容器并不神秘,他和我们日常看到的容器功能是一样的,就是用来装东西的。
目前,容器技术已经得到广泛的应用,众多的优秀的php开发,都是基于容器技术来实现服务自动加载的。
例如: Laravel, ThinkPHP5.1等等。
容器,也称服务容器,简称(IOC)
基本思想:就是拿来就用,最大限度的简化外部对象的调用,类似于:[即插即用]的思想
基本实现分三步:
1.创建容器,将类与类的实例化过程绑定到容器中(不局限于类,也可是接口或其它)
2.服务注册,将可能用到的工具类全部绑定到容器中
3.容器依赖:或者叫依赖容器,调用工作类时直接传入容器对象即可,工具类的实例化由容器完成
下面是实现的源码:
?php //数据库操作类html' target='_blank'>class Db//数据库连接public function connect()return 数据库连接成功 br //数据验证类class Validate//数据验证public function check()return 数据验证成功 br //视图图class View//内容输出public function display()return 用户登录成功 /******************************************************************************///一.创建容器类class Container//创建属性,用空数组初始化,该属性用来保存类与类的实例化方法protected $instance = [];//初始化实例数组,将需要实例化的类,与实例化的方法进行绑定public function bind($abstract, Closure $process)//键名为类名,值为实例化的方法$this- instance[$abstract] = $process;//创建类实例public function make($abstract, $params=[])return call_user_func_array($this- instance[$abstract],[]);/******************************************************************************///二、服务绑定: 将类实例注册到容器中$container = new Container(); //将Db类绑定到容器中$container- bind( db , function(){return new Db();//将Validate类实例绑定到容器中$container- bind( validate , function(){return new Validate();//将View类实例绑定到容器中$container- bind( view , function(){return new View();//测试:查看一下当前容器中的类实例// var_dump($container- instance); die;/******************************************************************************///三、容器依赖:将容器对象,以参数的方式注入到当前工作类中//用户类:工作类class User//创建三个成员属性,用来保存本类所依赖的对象// protected $db = null;// protected $validate = null;// protected $view = //这三个与外部对象对应的三个属性可以全部删除了,因为它们都已经事先注册到了容器中//用户登录操作// public function login(Db $db, Validate $validate, View $view)//此时,只需从外部注入一个容器对象即可,Db,Validate和View实例方法全部封装到了容器中public function login(Container $container)//实例化Db类并调用connect()连接数据库// $db = new Db();// echo $db- connect();echo $container- make( db )- connect();//实例化Validate类并调用check()进行数据验证// $validate = new Validate();// echo $validate- check();echo $container- make( validate )- check();//实例化视图类并调用display()显示运行结果// $view = new View();echo $container- make( view )- display();//在客户端完成工具类的实例化(即工具类实例化前移)// $db = new Db();// $validate = new Validate();// $view = new View();//现在注入过程就非常简单了,只需要从外部注入一个容器对象即可//创建User类$user = new User();//调用User对象的login方法进行登录操作// echo $user- login();// 将该类依赖的外部对象以参数方式注入到当前方法中,当然,推荐以构造器方式注入最方便echo h3 用依赖容器进行解藕: /h3 // echo $user- login($db, $validate, $view);//现在工作类中的login方法不需要再像对象依赖注入那样写三个对象了,只需要一个容器对象就可以了echo $user- login($container);
其实,容器模式,还可以用外观设计模式,进一步进行简化。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP !
相关推荐:
聊聊框架开发的依赖注入,容器与外观模式(上部)
以上就是聊聊框架开发的依赖注入,容器与外观模式(中部)的详细内容,PHP教程
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答