依赖注入

在一个类中经常会依赖于其他的对象,先看一下经典的写法

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来反射类方法。

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里

laravel mysql注入_laravel中如何利用反射实现依赖注入相关推荐

  1. go 依赖注入 哪个好_go与java的依赖注入实现的一些差异

    go语言是一门开源的语言,我这里说开源,并不是指go的编译器等是开源,而是指go在机制上决定了当我们引入一个类库的时候,实质上是引入类库的源码. 纯go实现的类库.模块,基本是无法以编译后二进制的形式 ...

  2. Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)

    在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...

  3. ASP.NET MVC中使用Autofac实现简单依赖注入

    本文参考资料: 1.https://www.cnblogs.com/RayWang/p/11128554.html. 2.https://www.cnblogs.com/eedc/p/6127181. ...

  4. AspectCore中的IoC容器和依赖注入

    IOC模式和依赖注入是近年来非常流行的一种模式,相信大家都不陌生了,在Asp.Net Core中提供了依赖注入作为内置的基础设施,如果仍不熟悉依赖注入的读者,可以看看由我们翻译的Asp.Net Cor ...

  5. Spring框架中的控制反转和依赖注入

    控制反转: 控制反转是用来降低代码之间的耦合度的,基本思想就是借助"第三方"实现具有依赖对象的解耦. 为什么需要控制反转,因为项目中对象或多或少存在耦合.控制反转的关键在于Ioc容 ...

  6. spring中的控制反转和依赖注入之间的关系

    Spring中的控制反转:把new这一个过程交给了spring容器去处理. 控制反转就是将new对象这一个过程交给外部去做(即Spring)而不是自己去创建. 图中的1"控制正转" ...

  7. java中依赖注入_关于Java:什么是依赖注入?

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: What is Inversion of Control? 我真的很困惑依赖注入的概念. 我对软件领域非常陌生,我对下面 ...

  8. 轻松了解Spring中的控制反转和依赖注入

    点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长 每天早上8点20分, 第一时间与你相约 每日英文 When you have something you really l ...

  9. 依赖注入及AOP简述(五)——依赖注入的方式 .

    二.依赖注入的应用模式 前面我们了解了依赖注入的基本概念,也对一些依赖注入框架进行了简单的介绍,这一章我们主要来讨论作为开发者如何利用依赖注入框架来实现依赖注入的设计思想. 1.     依赖注入的方 ...

最新文章

  1. Firefox下http协议监测工具LiveHttpHeaders
  2. Catalan数——卡特兰数
  3. 使用HTML5的自定义数据属性的jQuery选择器
  4. Java数据库连接池实现原理
  5. 信息系统项目管理师历年论文题目
  6. 脸书令牌怎么使用_网工知识角|QOS技术令牌桶算法一分钟速记,考试无忧
  7. 如何用控制台启动一个wcf服务
  8. Android开发学习总结(三)——appcompat_v7项目说明
  9. 开课吧:全栈工程师的关键开发技能(硬实力)
  10. IDE、SATA、SCSI、SAS、iSCSI
  11. Web中间件常见安全漏洞
  12. python:savgol_filter的简单使用
  13. 集中式存储和分布式存储
  14. 007-Cobbler批量自动化部署Windows10和Server 2019及激活
  15. 深度学习入门之神经网络的学习思维导图
  16. 273 块钱购入的域名,值了
  17. tongyongwangyekuaijiefangshi
  18. python的turtle画小绵羊_Python作图
  19. 为什么赛博朋克里总少不了日本元素?
  20. EDIUS字幕窗口中保存和自动另存为该怎样区分

热门文章

  1. controller不跳转页面的几个原因_狗狗为什么不睡觉?是这几个原因
  2. 个人博客三|首页后台开发
  3. 如何优雅地在 Java 8 中处理异常
  4. leetcode-521-Longest Uncommon Subsequence I
  5. Vim使用技巧及基本命令分类
  6. Hibernate缓存原理与策略 Hibernate缓存原理:
  7. 适用于OpenGL离屏渲染上下文的初始化代码
  8. 浏览器的工作过程(转)
  9. 网络系统管理之静态路由配置
  10. 赢了!赢了!赢了!反抗违法裁员,小米以绩效低为由辞退员工败诉!这里单独给大家一些应对参考!...