<?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. 脚本放在 <body> 元素的底部

    建议把脚本放在 <body> 元素的底部. 这会提高网页加载速度,因为 HTML 加载不受制于脚本加载.

  2. Java 创建文件夹和文件

    String path="D://my"; File folder=new File(path); if(!folder.exists() && !folder.i ...

  3. AssetBundle in Unity 5.0

    http://forum.unity3d.com/threads/new-assetbundle-build-system-in-unity-5-0.293975/

  4. Apache配置--用户认证(针对目录访问)-update2015-05-02

    通过Apache配置可以限制用户对目录的访问,会弹出像phpadmin一样的登陆框. ========================================================= ...

  5. mono的Type.GetType(string)总是为空

    public partial class Index : System.Web.UI.Page { protected override void OnLoad(EventArgs e) { Resp ...

  6. AutoMocker单元测试

    /// <summary> /// 测试获取所有物流 /// </summary> [TestMethod] public void TestExpressController ...

  7. fork与vfork

    先看一个fork的例子: ; int main(void) { int var, pid; ; ) { printf("vfork error"); exit(-); } ) { ...

  8. Win7下Python2.7环境安装paramiko模块

    Win7下Python2.7环境安装paramiko模块,经过安装并测试成功,整理文档如下: 1.下载安装Windows版本的Python2.7,我默认装在C:\Python27 我的python已经 ...

  9. Python开发【第七篇】:面向对象

    Python之路[第五篇]:面向对象及相关   面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否 ...

  10. php概率算法(转)

    这是一个很经典的概率算法函数: function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr) ...