<?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. StringBuilder 拼接sql语句比较快

    StringBuilder 拼接sql语句比较快StringBuilder strBuilder = new StringBuilder();strSql += "insert into t ...

  2. Integer 与int 赋值比较

    测试代码: @Test public void IntegerTest() { Integer i01 = 59; int i02 = 59; Integer i03 = Integer.valueO ...

  3. JSP 核心标签库

    1 JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 2 JSTL标签库分类 核心标 ...

  4. 15款优秀移动APP产品原型设计工具

    一新来小盆友问:“移动产品原型设计都用啥工具?” 答:“@#¥……&%*” 又问:“能详细说下各个工具吗?我比较一下” “……” 好吧,谁让我那么的爱分享而你又是小美女呢 ———————正文开 ...

  5. win10系统点击关机按钮后无法关机的解决办法

    先吐槽下:我越发的发现我现在成了修电脑的了,我的职位是linux运维,现在干的活很蛋疼,公司只有我一个运维,修电脑.搞网络.抬服务器.弄监控,搭环境.搞自动化发布.弄虚拟化都我一个人哇.好了,打住. ...

  6. Mastering C# structs

    http://www.developerfusion.com/article/84519/mastering-structs-in-c/

  7. 如何在ubuntu中启用SSH服务

    如何在ubuntu14.04 中启用SSH服务 开篇科普:  SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为 ...

  8. php实现发送邮件

    smtp.php: <?php class smtp {     /* Public Variables */     var $smtp_port;     var $time_out;    ...

  9. git diff

    git diff  工作区与暂存区的差别 git diff -cached / git diff -staged  暂存区与版本库的差别 git diff HEAD  工作区与版本库的差别 git d ...

  10. css display 总结

    1. 块级元素(display: block) 1.1. 独占一行 1.2. 高度.宽度.行高.顶和底边距 可设置 1.3. 默认宽度 父容器100% 2. 内联元素(display: inline) ...