laravel中如何利用反射实现依赖注入
依赖注入
在一个类中经常会依赖于其他的对象,先看一下经典的写法
class Foo {
public $bar;
public function __construct() {
$this->bar = new Bar();
}
}
$foo = new Foo();
当类的依赖发生改变时,比如 Bar 这个类需要实例化参数时,而依赖于它的类有很多,总不能一个一个地去修改吧。
再看一下使用 依赖注入 怎么做
class Foo {
public $bar;
public function __construct($bar) {
$this->bar = $bar;
}
}
$bar = new Bar();
//$bar = new Bar($args);
$foo = $foo = new Foo($bar);
将 Bar 类在外部实例化好后,作为一个参数传入进 Foo 类,从而实现了 控制反转 ,假如现在 Bar 类需要参数了,外部修改就好了,不必一个个地去修改依赖于它的类。
laravel中的依赖注入
在 laravel 中,经常写出下面这种代码
class SomeController {
public function index(Request $request) {
dd($request->all());
}
}
只要在方法参数中申明 Request $request,就可以直接使用 $request 对象了,非常地方便。
其实laravel在背后利用PHP的反射机制为我们做了 $request = new Request 这一步。反射是一种类的反省能力,可以导出类的详细信息包括属性、方法、甚至注释等等。关于反射可以查看PHP文档http://php.net/manual/zh/intro.reflection.php
实现,看代码
$method = new ReflectionMethod('SomeController', 'index');
$args = [];
foreach($method->getParameters() as $parameter) {
if ($class = $parameter->getClass()) {
$args[] = new $class->name; //$request = new Request
}
}
$method->invokeArgs(new SomeController, $args);
通过 ReflectionMethod 获取类方法的参数,如果参数是其他的类,就实例化后作为参数使用 ReflectionMethod::invokeArgs 传入到类方法中,原理就是这么简单。
通常使用 new ReflectionClass('className') 来反射类,ReflectionMethod 来反射类方法。
laravel中如何利用反射实现依赖注入的更多相关文章
- Laravel框架下容器Container 的依赖注入和反射应用
依赖注入,简单说是把类里头依赖的对象,置于类外头,即客户端调用处.相当于把类与类解耦. 一个简单的例子: class A { public function __construct() { // 这种 ...
- Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
- 轻松了解Spring中的控制反转和依赖注入(二)
紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...
- (7)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 利用Polly+AOP+依赖注入封装的降级框架
创建简单的熔断降级框架 要达到的目标是: 参与降级的方法参数要一样,当HelloAsync执行出错的时候执行HelloFallBackAsync方法. public class Person { [H ...
- Spring中的控制反转和依赖注入
Spring中的控制反转和依赖注入 原文链接:https://www.cnblogs.com/xxzhuang/p/5948902.html 我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达 ...
- PHP类的反射和依赖注入
/** * Class Point */ class Point { public $x; public $y; /** * Point constructor. * @param int $x ho ...
- 深入分析MVC中通过IOC实现Controller依赖注入的原理
这几天利用空闲时间,我将ASP.NET反编译后的源代码并结合园子里几位大侠的写的文章认真的看了一遍,收获颇丰,同时也摘要了一些学习内容,存入了该篇文章:<ASP.NET运行机制图解>,在对 ...
- 轻松了解Spring中的控制反转和依赖注入(一)
我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级Ja ...
- 在 MVC 控制器中使用 构造函数时行依赖注入 (IoC)
在 Controller 中使用 构造函数进行依赖注入 (IoC) 1. Controller 代码: ICard card; ICardCategory cardCategory; public C ...
随机推荐
- .NET开发微信小程序-接收微信支付回调数据
获取微信支付传回来的数据 1.MVC控制器 /// <summary> /// 付款返回的数据 /// </summary> /// <returns></r ...
- js算法初窥01(排序算法01-冒泡、选择、插入)
排序,我想大家一定经历过或者正在经历着.或许你不懂算法,对排序算法一无所知,但是你一定用过一些第三方库的api来一键排序,那么,在你享受便捷的同时,你是否想过它的底层是如何实现的?这样的算法实现方式是 ...
- 线程池ThreadPoolExecutor类的使用
1.使用线程池的好处? 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. 第三:提高线程的可管理性 ...
- HTTP协议GET HEAD简单介绍
一.HTTP协议简介 超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议,自 1990 年起,HTTP 就已经被应用于 WWW 全球信息服务系统. HT ...
- Java 8 文件操作(转)
我们知道在JDK6甚至之前的时候,我们想要读取一个文本文件也是非常麻烦的一件事,而现在他们都变得简单了, 这要归功于NIO2,我们先看看之前的做法: 读取一个文本文件 BufferedReader b ...
- HQL: The Hibernate Query Language
Chapter 14. HQL: The Hibernate Query Language 14.1. Case Sensitivity 14.2. The from clause 14.3. Ass ...
- Project facet Java version 1.8 not supported JDK版本不对无法启动项目解决办法
https://jingyan.baidu.com/article/6c67b1d69a59a02787bb1e30.html
- vue学习之响应式原理的demo实现
Vue.js 核心: 1.响应式的数据绑定系统 2.组件系统. 访问器属性 访问器属性是对象中的一种特殊属性,它不能直接在对象中设置,而必须通过 defineProperty() 方法单独定义. va ...
- spring创建bean及数据注入
通过spring的IoC可以实现由配置文件来创建类的对象,可以降低类鱼类之间的耦合, 通常我们都是在代码中控制对象的生成和属性注入,而使用IoC后,就可以将设计好的类交给IoC容器,让容器去控制对象的 ...
- ATM机
ATM 要求 示例代码: https://github.com/triaquae/py_training/tree/master/sample_code/day5-atm