laravel中如何利用反射实现依赖注入
2019-01-30 23:09
239 查看
依赖注入
在一个类中经常会依赖于其他的对象,先看一下经典的写法
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来反射类方法。
相关文章推荐
- 如何理解java中的依赖注入 通过构造函数和反射机制来实现的
- 【Java】利用注解和反射实现一个"低配版"的依赖注入
- 依赖注入 - 如何使用反射和注解实现简单的依赖注入
- 浅析PHP类的反射来实现依赖注入过程
- 利用依赖倒置和依赖注入实现应用程序解耦
- thinkphp如何利用反射实现钩子方法
- 利用反射简单模拟Spring的控制反转(Ioc)和依赖注入(DI)
- (4) 利用 Setter方式实现 【第一种方式】 依赖注入,编码剖析Spring依赖注入的原理
- 如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
- 如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
- 如何实现Spring依赖注入
- 如何利用反射实现EL表达式
- PHP实现依赖注入-使用反射机制和动态代理技术 - 简单思想(咋个办呢 zgbn)
- 如何利用反射机制实现前台页面共用一个servlet文件
- 利用ASP.netCore自带DI(DependencyInjection)实现批量依赖注入
- 如何用C#实现依赖注入?
- Spring依赖注入的XML配置文件的实现思想(1)——准备工作:如何读取XML的文件的内容
- 使用反射及依赖注入实现灵活的插件模式
- 利用java的反射原理实现数据注入功能
- SSH之Spring——IOC如何实现依赖注入