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到后续请求的类中, ...
随机推荐
- JQuery遍历方法$.each输出函数
each()方法能使DOM循环结构简洁,不容易出错.each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组.多维数组.DOM, JSON 等等在javaScript开发过程中使用$ ...
- easyUI datagrid view扩展
//扩展easyuidatagrid无数据时显示界面 var emptyView = $.extend({}, $.fn.datagrid.defaults.view, { onAfterRender ...
- CSS学习笔记——简述
CSS3学习的教程来自后盾网 div+css网页标准布局 1>div i>DIV全称是division,意为“区块.分割”,DIV标签是一个无意义的容器标签,用于将页面划分出不同的区域 i ...
- yourphp点击刷新验证码
加入css <script type="text/javascript" src="./Public/Js/my.js"></script&g ...
- 设计模式学习——策略模式(Strategy Pattern)
0. 前言 最近在重构公司的一个项目的时候,在抽取DES加密重复部分代码的时候,突然间想起了策略模式,感觉策略模式好像可以应用上,于是重新学习了下策略模式.注:在DES加密中,有DES和TDES算法, ...
- strace命令(收集整理,常看常新)
starce的用途和参数:http://man.linuxde.net/strace(linux命令大全) strace命令是一个集诊断.调试.统计与一体 的工具,我们可以使用strace对应用的系统 ...
- struts2 拦截器和actioninvocation、PreResultListener
Interceptor说明 Interceptor的接口定义没有什么特别的地方,除了init和destory方法以外,intercept方法是实现整个拦截器机制的核心方法.而它所依赖的参数Act ...
- php.ini中有关安全的设置
php的默认配置文件在 /usr/local/apache2/conf/php.ini,通过为了使你的web更安全,我们需要对php.ini进行一些设置! (1) 打开php的安全模式 php的安全模 ...
- 百万级数据查询到datatable中,提示内存溢出
参考资料: http://group.cnblogs.com/topic/32230.html
- 弹出框三 之 sweetalert
1下载sweetalert 2.引入到项目中 <link href="~/Content/sweetalert.css" rel="stylesheet" ...