zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    mv命令(转)
    Linux获得命令帮助(学习笔记五)
    Shell解释器(学习笔记四)
    rmdir 命令(转)
    Java从零开始学十八(抽象类和接口)
    rm 命令(转)
    Centos6.6系统root用户密码恢复案例(转)
    Java从零开始学十七(简单工厂)
    Java从零开始学十六(多态)
    mkdir命令(转)
  • 原文地址:https://www.cnblogs.com/zjhblogs/p/5599986.html
Copyright © 2011-2022 走看看