php DI实现实例:


<?php //DI 主要运用IoC用于解决 依赖文件共享(无需每一个依赖都手动注册) //管理应用程序中的『全局』对象(包括实例化、处理依赖关系)。 //可以延时加载对象(仅用到时才创建对象)。 //促进编写可重用、可测试和松耦合的代码。 class di{ private $_definitions=[];//保存依赖定义 private $_dependencies=[];//保存依赖信息 private $_singletons=[];//用于保存单例 private $_reflections=[];//用于缓存(依赖)实例 private $_params=[];//保存构造函数的参数 public function set($class,$dependencies=[],$params=[]){ //注册一个类 声明它的 类名、依赖类、构造实例的参数 $this->_definitions[$class]=$class; $this->_dependencies[$class]=$dependencies; $this->_params[$class]=$params; } /*** * 创建依赖实例方法 * $class 创建实例的类名 * $params 创建实例的依赖参数 * $config 创建实例的配置 ***/ public function build($class,$params=[],$config=[]){ //验证依赖--递归创建 $this->validate($class); //将实例化的类储存到 公用类库 $this->_reflections[$class]=new $class($this->validate_create($class)); } public function get($class,$config=[]){ //验证依赖--递归创建 $this->validate($class); //最终返回结果 return new $class($this->validate_create($class)); } //用于验证依赖并创建 public function validate($class,$params=[],$config=[]){ if(isset($this->_dependencies[$class])){ //是否存在依赖信息--如果存在创建新对象 储存到库 foreach($this->_dependencies[$class] as $v){ $this->build($v);//创建依赖 } } } //最终创建对象前 验证参数配置并构成 public function validate_create($class){ $arr=[]; //判断是否存在依赖属性 if(isset($this->_params[$class])){ //将类名和的依赖类 对应 foreach($this->_params[$class] as $v){ //从公共库取出实例加入参数 $arr[$v]=$this->_reflections[$v]; } } return $arr; } } //测试类 class test{ protected $_word; protected $_else; public function __construct($class){ foreach($class as $k=>$v){ if($v instanceof jk1){ $this->_word=$v; }elseif($v instanceof jk2){ $this->_else=$v; } } } public function say1(){ $this->_word->jk1_say(); } public function say2(){ $this->_else->jk2_say(); } } //定义两个依赖接口 interface jk1{ public function jk1_say(); } interface jk2{ public function jk2_say(); } //两个例子 class my_jk1 implements jk1{ protected $obj; public function __construct($class){ foreach($class as $k=>$v){ $this->obj=$v; } } public function jk1_say(){ echo $this->obj->abc(); } } class my_jk2 implements jk2{ public function jk2_say(){ echo __METHOD__; } } //my_jk1的依赖 class my_jk1_ext{ public function abc(){ echo __METHOD__; } } $di =new di; $di->set('my_jk1',['my_jk1_ext'],['my_jk1_ext']);//添加关系 $di->set('test',['my_jk1','my_jk2'],['my_jk1','my_jk2']); $a=$di->get('test'); $a->say1(); echo "<hr>"; $a->say2();

 

转载于:https://www.cnblogs.com/zjhblogs/p/5599986.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值