本文来自pilishen.com----原文连接; 欢迎做客咱们的php&Laravel学习群:109256050php
该篇属于《Laravel底层核心技术实战揭秘》这一课程《laravel底层核心概念解析》这一章的扩展阅读。因为要真正学好laravel底层,有些PHP相关的知识必须得了解,考虑到学员们的基础差别,为了不视频当中过于详细而连篇累牍,故将一些laravel底层实现相关的PHP知识点以文章形式呈现,供你们预习和随时查阅。laravel
在laravel的routes.php
或者web.php
里以下测试:web
class Bar {}
Route::get('/test', function(Bar $bar){
dd($bar);
});
复制代码
在以前的文章里,咱们知道,要往一个函数或方法里传参,尤为是传class的实例化对象,那么以前你必须得有个实例,说白了就是得new
一下,可是上面的代码没瞅见有传参过程,只是这个route
的回调函数里指望传入一个Class Bar
的实例$bar
,没有实例化过程,这能行吗?bash
Bar {#250}
复制代码
咦?竟然能够!框架
好,既然你能够,先无论别的,我再给你整的复杂些:ide
class Baz {}
class Bar {
protected $baz;
public function __construct(Baz $baz)
{
$this->baz = $baz;
}
}
Route::get('/test', function(Bar $bar){
dd($bar);
});
复制代码
看你此次还行?函数
Bar {#253 ▼
#baz: Baz {#255}
}
复制代码
呀!厉害了——我可没有给你传new Bar(new Baz)
进去啊!post
也便是说,不管是在route回调函数里,仍是在controller里,仍是其余相关地方,laravel的IoC Container能自动进行依赖解析、注入,像上面的例子,它能知道咱们指望传入一个Class Bar
的实例$bar
,而后自动背后给咱们建立了一个,同时,它也能知道Class Bar
的constructor中须要传入一个Class Baz
实例,也进一步给咱们建立了。因此,这整个过程当中,咱们不须要去手动new
。学习
可能,以前你有本身查看过laravel的源码,在层层依赖的状况下,你会发现明明其间不少class都有constructor,都须要传入dependency,可是laravel在调用的过程当中,啥也没给传,按照以前的思路,这根本行不通嘛~测试
那么如今,我们知道laravel的Container能自动解析依赖(automatic dependency resolution
),虽然如今还不清楚它背后具体怎么实现,至少不影响继续往下看源码了。
至于具体是怎么实现的,以及我们可否本身写一个这样的功能,而后用在本身的框架里,这些咱们在《Laravel底层核心技术实战揭秘》相应章节具体呈现~