提到laravel框架,我的脑海中最先浮现的是什么呢?那一定是,依赖注入、控制反转。作为后来居上的框架,laravel能取得如此的成绩,优秀的思想也贡献了很大一部分力量。
什么是Container?
定义:
那么在提到依赖注入之前我们就不得不先说一说一切的根本:容器Container。所谓容器,听名字就知道,是一个仓库,装东西用的,所以,container所有的功能,都围绕一个主题:管理类。
工作流程:
首先,生成一个数组绑定列表,用自定义名称作为主键,然后键值是闭包(输入的可能是闭包或者实体类,但是,在存储的时候,都统一转化成了闭包存储)。
其次,根据绑定列表,生成对应的类的实例,供用户使用,调用的时候,发现如果已经生成,不需要重新生成使用,实际上,Container就是类的一个仓库,以及缓存。
在laravel中Container的实现类为\Illuminate\Container\Container,该类提供了多个操作类的方法。
Container位于…/vendor/laravel/framework/src/Illuminate/Container/Container.php中,接下来我们来看下其常用方法(因版本不同,源码可能略有偏差,如果问题,欢迎留言指正!!!)
别名函数:
/**
* 此方法会给abstract类设置一个alias别名
*/
public function alias($abstract, $alias)
{
$this->aliases[$alias] = $abstract;
$this->abstractAliases[$abstract][] = $alias;
}
/**
*此方法会获取abstract的别名,如果abstract本身为别名则直接返回
**/
public function getAlias($abstract)
{
if (! isset($this->aliases[$abstract])) {
return $abstract;
}
if ($this->aliases[$abstract] === $abstract) {
throw new LogicException("[{
$abstract}] is aliased to itself.");
}
return $this->getAlias($this->aliases[$abstract]);
}
/**
*判断$name是否为别名
**/
public function isAlias($name)
{
return isset($this->aliases[$name]);
}
isBuildable函数:
用来判断指定类型是否可构建(实例化)。满足二者之一则可实例化:实际类型是Closure或者实际类型与抽象类型名称相同(其实就是普通的类名称,非抽象类和接口)
protected function isBuildable($concrete, $abstract)
{
return $concrete === $abstract || $concrete instanceof Closure;
}
容器绑定函数:bind、singleton
singleton是单例的,是bind函数share的一个应用。
public function bind($abstract, $concrete = null, $shared = false)
{
// 删除所有陈旧的实例和别名
$this->dropStaleInstances(