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();
php DI实现实例:的更多相关文章
- .Net Core2.2 + EF Core + DI,三层框架项目搭建教程
笔记: 近两年.Net Core发展的很快,目前最新版为3.0预览版,之前在网上买了一本1.1版书籍都还没来得及看呢,估计现在拿出来看也毫无意义了.已多年.net工作经验,看书不如直接实际上手来得快, ...
- 最近面试的题目(WEB、Service、SQL、JavaScript)
整理一下最近面试被问到的主要题目.由于本人主要是做WEB及WEB SERVICE这块,使用的语言主要是C#,数据库主要用到的也是MSSQL.所以就分成这些块来整理(有些是在面试之后才意识到回答不对), ...
- 《Prism 5.0源码走读》UnityBootstrapper
UnityBootstrapper (abstract class)继承自Bootstrapper(abstract)类, 在Prism.UnityExtensions.Desktop project ...
- shiro实战系列(一)之入门实战
一.什么是shiro? Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密. Apache Shiro 的首要目标是易于使用和理解.安全有 ...
- ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(二)数据库初始化、基本登录页面以及授权逻辑的建立
前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/asp ...
- python 笔记二
17.进程线程 进程间通信方式:管道Pipe:队列Queue:共享内存Value.Array.Manager: 多进程同步:锁Lock.递归锁RLock.Condition(条件变量):事件event ...
- WebApiClient性能参考
1 文章目的 昨天写了走进WebApiClientCore的设计,介绍了WebApiClient的变化与设计之后,收到大家支持的.赞许的,还有好的建议和顾虑,比如WebApiClient性能怎么样,有 ...
- 最近学习工作流 推荐一个activiti 的教程文档
全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...
- asp.net core的DI框架思考以及服务实例的获取方式总结
转载请注明出处: https://home.cnblogs.com/u/zhiyong-ITNote/ 整个asp.net core管道从WebHostBuilder到WebHost到后续请求的类中, ...
随机推荐
- spring-boot-note
1 java配置和注解配置相结合,不需要任何的xml配置即可 2 spring tool suite 3 src/main/resources/banner.txt http://patorjk.co ...
- PHP设计模式-策略模式 转
策略模式(Strategy Pattern) 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个 ...
- Java——文本组件:JTextComponent
import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing ...
- YOURPHP的分页完整版
html代码 <?php print_r($ser['searchtype']);?> <select name="searchtype"> <opt ...
- Robot Framework--11 RF结合Jenkins
转自:http://blog.csdn.net/tulituqi/article/details/17846463 为什么我们要引入RF?其实最初我们引入RF是为了能够快速的开展自动化验收测试,为敏捷 ...
- [C#基础]c#中的BeginInvoke和EndEndInvoke
摘要 异步这东西,真正用起来的时候,发现事情还是挺多的,最近在项目中用到了异步的知识,发现对它还是不了解,处理起来,走了不少弯路.觉得还是补一补还是很有必要的. MSDN原文地址:https://ms ...
- 手机注册获取验证码的PHP代码
php代码 <?php require dirname(__FILE__).'/include/common.inc.php';//这是在cms2008下面做的测试 header("c ...
- EF方便的添加一条信息...
//刚开始通过EF添加数据都是这样的...↓ var db = new DBEntities() T_User t_userinfo = new T_User() { Type = "typ ...
- C#5.0 特性
Visual Studio 2012 中 Visual C# 的新增功能 Lambda表达式 表达式树:把代码,转换成数据,然后分析数据发现其组成部分,最后转换成可以传递到其他程序的字符串 LinQ表 ...
- Windows Phone 开发环境的搭建
1. 系统 系统:Windows 7(32 位).Windows 7(64 位).Windows Vista SP2(32 位)和 Windows Vista(64 位)或者更高版本. 不支持 :Wi ...