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的含义解释.小编觉得挺不错的,现在就分享给 ...
随机推荐
- Java Heap dump文件分析工具jhat简介
jhat 是Java堆分析工具(Java heap Analyzes Tool). 在JDK6u7之后成为标配. 使用该命令需要有一定的Java开发经验,官方不对此工具提供技术支持和客户服务. 用法: ...
- Tkinter 之Canvas画布
一.参数说明 参数 作用 background(bg) 指定 Canvas 的背景颜色 borderwidth(bd) 指定 Canvas 的边框宽度 closeenough 指定一个距离,当鼠标与画 ...
- Go by Example-常量
Go by Example 中文:常量 在上一节中提到了变量,常用的有两种定义的方式使用var或者短变量的形式进行定义,这节我们来说常量. 常量 常量是指程序运行时不可改变的值,常量必须初始化值,定义 ...
- HTML中调用带有SoapHeader头的WebService的两种方法
第一种: function CallWebMethodWithHeader() { var soapXML = "<soap:Envelope xmlns:xsi='http://ww ...
- sqlserver 触发器语法
语法:Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)CREATE TRIGGER ...
- 【Oracle/Maven】Maven导入oracle11g 自携带jdbc驱动包ojdbc6.jar到本地库
Maven需要下载解压并添加到classpath,如果不明可以参考https://www.cnblogs.com/xiandedanteng/p/11403480.html 然后在命令行窗口执行: m ...
- JS pc端和移动端共同实现复制到剪贴板功能实现
JS pc端和移动端实现复制到剪贴板功能实现 在网页上复制文本到剪切板,一般是使用JS+Flash结合的方法,网上有很多相关文章介绍.随着 HTML5 技术的发展,Flash 已经在很多场合不适用了, ...
- react图片自适应组件
import * as React from 'react'; import 'animate.css/animate.css' import {AutoImg} from "./style ...
- 深度学习框架PyTorch一书的学习-第七章-生成对抗网络(GAN)
参考:https://github.com/chenyuntc/pytorch-book/tree/v1.0/chapter7-GAN生成动漫头像 GAN解决了非监督学习中的著名问题:给定一批样本,训 ...
- c# 遍历局域网计算机(电脑)获取IP和计算机名称
c#可以遍历局域网计算机,获取全部计算机的名称和IP地址,网上提供了相关的几种方法,并对效率进行了比较,但是没有对各种方法进行比较,以确定可以使用的情况.这篇文章将对这几种方法进行分析,以帮助了解各种 ...