<?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();

php DI实现实例:的更多相关文章

  1. .Net Core2.2 + EF Core + DI,三层框架项目搭建教程

    笔记: 近两年.Net Core发展的很快,目前最新版为3.0预览版,之前在网上买了一本1.1版书籍都还没来得及看呢,估计现在拿出来看也毫无意义了.已多年.net工作经验,看书不如直接实际上手来得快, ...

  2. 最近面试的题目(WEB、Service、SQL、JavaScript)

    整理一下最近面试被问到的主要题目.由于本人主要是做WEB及WEB SERVICE这块,使用的语言主要是C#,数据库主要用到的也是MSSQL.所以就分成这些块来整理(有些是在面试之后才意识到回答不对), ...

  3. 《Prism 5.0源码走读》UnityBootstrapper

    UnityBootstrapper (abstract class)继承自Bootstrapper(abstract)类, 在Prism.UnityExtensions.Desktop project ...

  4. shiro实战系列(一)之入门实战

    一.什么是shiro? Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密.   Apache Shiro 的首要目标是易于使用和理解.安全有 ...

  5. ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(二)数据库初始化、基本登录页面以及授权逻辑的建立

    前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/asp ...

  6. python 笔记二

    17.进程线程 进程间通信方式:管道Pipe:队列Queue:共享内存Value.Array.Manager: 多进程同步:锁Lock.递归锁RLock.Condition(条件变量):事件event ...

  7. WebApiClient性能参考

    1 文章目的 昨天写了走进WebApiClientCore的设计,介绍了WebApiClient的变化与设计之后,收到大家支持的.赞许的,还有好的建议和顾虑,比如WebApiClient性能怎么样,有 ...

  8. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

  9. asp.net core的DI框架思考以及服务实例的获取方式总结

    转载请注明出处: https://home.cnblogs.com/u/zhiyong-ITNote/ 整个asp.net core管道从WebHostBuilder到WebHost到后续请求的类中, ...

随机推荐

  1. HTTP协议发展脉络

    1 发展脉络 1.1 1991 HTTP/0.9 建立TCP连接.客户端发送请求(只有GET命令).服务端返回请求(只能返回html格式字符串)后就关闭TCP连接 1.2 1996.5 HTTP/1. ...

  2. JSON-LD

    RDF RDF用于信息需要被应用程序处理而不是仅仅显示给人观看的场合.RDF提供了一种用于表达这一信息.并使其能在应用程序间交换而不丧失语义的通用框架.既然是通用框架,应用程序设计者可以利用现成的通用 ...

  3. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【三】——Web Api入门

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 经过前2节的介绍,我们已经把数据访问层搭建好了,从本章开始就是Web Api部分了.在正式开 ...

  4. 使用docker安装lamp

    docker search -s 10 lamp #搜索被收藏或使用较多的LAMP镜像,小伙伴们都推荐使用tutum/lamp docker pull tutum/lamp #下载镜像 #使用默认方式 ...

  5. yourphp的sql语句

    1.插入单条数据 $data[0]['cardid'] = $_POST['cardid']; $data[0]['name'] = $_POST['name']; $data[0]['mobile' ...

  6. ecshop 版权问题 Powered by ECShop

    将下代码 <div style="width:0px;height: 0px;overflow:hidden;">{foreach from=$lang.p_y ite ...

  7. 捕获EF提交异常

    try { } catch (DbEntityValidationException dbex) { string errMsg = string.Empty; foreach (var eve in ...

  8. iOS版本控制git小结--yoowei

    # 显示隐藏文件 defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder # 不显示隐藏文件 d ...

  9. yii2 funson86\yii2-setting

    Yii2 Setting for other application, especially for Yii2 Adminlte Installation The preferred way to i ...

  10. Redis命令大全&中文解释&在线测试命令工具&在线中文文档

    在线测试命令地址:http://try.redis.io/ 官方文档:http://redis.io/commands http://redis.io/documentation Redis 命令参考 ...