laravle6.0-IOC-DI浅谈
1.什么是IOC,DI
IOC(Inversion of Control)控制反转:ioc意味着,你将自己设计好的对象交给容器来控制,而不是传统的在你的对象内部直接控制。比如:
人 操控 手机 做一些事情;
手机 实现人工智能,手机自己可以做一些事情。
DI(Dependency Injection)依赖注入:di意味着,在程序运行的过程中,动态的向某个对象提供它所需要的其他对象(换句话说就是:将依赖的对象分离,当依赖的对象需要使用这些依赖关系的时候,依赖关系才会被建立)。比如:
异地恋的关系:当男孩和女孩想要在一起的时候,可以通过开车建立联系到一起,约会吃饭做一些事;没有建立联系的时候是彼此独立的。
解耦:IOC,DI一定程度解耦程序
拓展:AOP(Aspect Oriented Programming)面向切面编程:是OOP的延续,将系统中非核心的业务提取出来,单独处理。
2.IOC的本质是?
laravel6.0中 IOC的本质就是一个容器数组。如下:
$array = [
'app' => 'Application::class', //闭包
'标识'=>'类'
]
依赖注入:就是把新的标识 , 新的类 新增到容器中。
3.浅谈laravel6.0中原生的IOC
将定义的类注入到容器[数组]中,当需要用到该类时,让容器构造出一个自己需要的类的实例,返回具体容器构造出来的实例来使用。
依赖注入:在容器类中 调用闭包函数 传入类名,具体信息 new类的对象 保存在容器数组$bindings[]中。
控制反转:需要某个类的对象,传入类名[别名,参数] 解析获取到该类的具体实例。
4.浅谈laravel的核心类container
/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php
$bindings[] 容器数组:所有注入的类保存在该数组中
绑定类到容器数组
public function bind($abstract, $concrete = null, $shared = false)
{
$this->dropStaleInstances($abstract); //删除旧实例和别名(已经绑定的类)
// 没有具体的类型给出,则设置具体类型的抽象类型。
if (is_null($concrete)) {
$concrete = $abstract;
}
//如果不是闭包Closure,这意味着它仅仅是被绑定到这个容器抽象类型
if (! $concrete instanceof Closure) {
$concrete = $this->getClosure($abstract, $concrete);
}
$this->bindings[$abstract] = compact('concrete', 'shared'); //把一个抽象类注入到容器中
// 如果抽象类型是在该容器中已经解析,触发反弹侦测,获取回调解析的对象副本
if ($this->resolved($abstract)) {
$this->rebound($abstract);
}
}
获取绑定(注入)类时需要的闭包
protected function getClosure($abstract, $concrete)
{
//返回闭包函数解析的 实例
return function ($container, $parameters = []) use ($abstract, $concrete) {
//如果要注入的abstract concrete类型具体是抽象类 则回调注入$container->build($concrete);
if ($abstract == $concrete) {
return $container->build($concrete);
}
//解析容器中给定的类型
return $container->resolve(
$concrete, $parameters, $raiseEvents = false
);
};
}
解析容器中给定的类型
protected function resolve($abstract, $parameters = [], $raiseEvents = true)
{
$abstract = $this->getAlias($abstract); //获取一个可用的抽象类的别名 $needsContextualBuild = ! empty($parameters) || ! is_null(
$this->getContextualConcrete($abstract)//获取具体抽象内容
); //
if (isset($this->instances[$abstract]) && ! $needsContextualBuild) {
return $this->instances[$abstract];//共享实例
} $this->with[] = $parameters; //覆盖堆栈的参数 $concrete = $this->getConcrete($abstract); //获取给定抽象的具体类型 // 递归绑定注册具体的实例,以致于所有嵌套的依赖也被解析
if ($this->isBuildable($concrete, $abstract)) {
$object = $this->build($concrete);
} else {
$object = $this->make($concrete);
} // 获取给定类型扩展回调
foreach ($this->getExtenders($abstract) as $extender) {
$object = $extender($object, $this);
} // 共享实例
if ($this->isShared($abstract) && ! $needsContextualBuild) {
$this->instances[$abstract] = $object;
} if ($raiseEvents) {
$this->fireResolvingCallbacks($abstract, $object);
} // 返回之前设置标志为真
$this->resolved[$abstract] = true;
// 移除覆盖当前版本堆栈参数,$with[] 覆盖堆栈参数数组
array_pop($this->with);
// 返回完全构造的具体实例
return $object;
}
laravle6.0-IOC-DI浅谈的更多相关文章
- [C#]6.0新特性浅谈
原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...
- Android v2.0 基本概念 - 浅谈
目录 Android框架 Linux Kernel 系统运行库 Libraries Android Runtime Application Framework Application Android框 ...
- Spring 学习教程(一):浅谈对Spring IOC以及DI的理解
一.个人对IoC(控制反转)和DI(依赖注入)的理解我们平时在开发java web程序的时候,每个对象在需要使用它的合作对象时,自己都要将它要合作对象创建出来(比如 new 对象),这个合作对象是由自 ...
- [转帖]浅谈IOC--说清楚IOC是什么
浅谈IOC--说清楚IOC是什么 Need Study https://www.cnblogs.com/DebugLZQ/archive/2013/06/05/3107957.html 博文目录 1. ...
- 浅谈.Net Core中使用Autofac替换自带的DI容器
为什么叫 浅谈 呢?就是字面上的意思,讲得比较浅,又不是不能用(这样是不对的)!!! Aufofac大家都不陌生了,说是.Net生态下最优秀的IOC框架那是一点都过分.用的人多了,使用教程也十分丰富, ...
- Spring5.0源码学习系列之浅谈BeanFactory创建
Spring5.0源码学习系列之浅谈BeanFactory创建过程 系列文章目录 提示:Spring源码学习专栏链接 @ 目录 系列文章目录 博客前言介绍 一.获取BeanFactory主流程 二.r ...
- Spring5.0源码学习系列之浅谈循环依赖问题
前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文浅谈Spring循环依赖问题,这是一个面试比较常见的问题 1.什么是循环依赖? 所谓的循环依 ...
- 浅谈Android Studio3.0更新之路(遇坑必入)
>可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...
- 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释
浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...
随机推荐
- Python怎么测试异步接口
当业务处理比较耗时时, 接口一般会采用异步处理的方式, 这种异步处理的方式又叫Future模式. 一般流程 当你请求一个异步接口,接口会立刻返回你一个结果告诉你已经开始处理,结果中一般会包含一个任务i ...
- 2018-2019-2 网络对抗技术 20165311 Exp 8 Web基础
2018-2019-2 网络对抗技术 20165311 Exp 8 Web基础 基础问题回答 实践过程记录 1.Web前端:HTML 2.Web前端:javascipt 3.Web后端:MySQL基础 ...
- 服务器(Linux)上运行python总结
跑实验换了几次服务器了,每次遇到相似问题都要重新百度,而且每次百度搜索出的顺序都不一样,又得重新找半天,这次把遇到的问题都总结一下. 1.准备 PuTTY和FileZilla FileZilla使用F ...
- 关于Vmvare虚拟机中Linux系统不能全屏的问题
安装虚拟机后并加载ubuntu后,发现界面一直是正方形的,真是神了. 但是当时沉迷学习,这点小细节并没有什么影响,就没有管它. 嗯.... 现在,为了追求完美,是时候让它全屏了,可无论怎样搞,怎样百度 ...
- How to transform the day time images to night time ? A series of paper review and some thinkings about this point.
How to transform the day time images to night time ? A series of paper review and some thinkings ab ...
- nginx反向代理部署vue项目(history模式)的方法
前言: 根据标题我们要区分出两个信息 1. history 模式部署 ( vue的路由模式如果使用history,刷新会报404错误.) 2. Nginx 做反向代理 问题1思考: vue-route ...
- 在基于acpi的linux系统上如何检查当前系统是否支持深度睡眠?
答: 执行以下命令: # dmesg|grep -i acpi |grep -i supports (S3表示支持深度睡眠) ACPI: (supports S0 S1 S3 S4 S5)
- LODOP打印超文本字符串拼接1 固定表格填充数值
前面的博文:Lodop打印控件传入css样式.看是否传入正确样式.Lodop打印如何隐藏table某一列,Lodop传入的样式可以不是页面本身的css样式,传入什么打印什么,此外,数据也是,超文本打印 ...
- ubuntu18.04 server配置静态ip,新的网络工具netplan的使用方法【转:http://forum.ubuntu.org.cn/viewtopic.php?t=487463】
最新发布的ubuntu18.04 server,启用了新的网络工具netplan,对于命令行配置网络参数跟之前的版本有比较大的差别,现在介绍如下:1.其网络配置文件是放在/etc/netplan/50 ...
- django:bootstrap table加载django返回的数据
bootstrap table加载表格数据有两类方式: 一种通过data属性的方式配置,一种是javascipt方式配置 这里看js配置方式: 1.当数据源为.json文件时 url参数写上json文 ...