IOC容器的绑定解析过程(绑定单例)
<?php
namespace Laravel\Container;
class Container
{
//存放实例 数组
protected $bindings = [];
//共享容器 存在共享"实例"
protected $instances = [];
/** * 绑定对象
* @param $abstract 标识
* @param null $concrete 具体的对象 - 字符串,闭包,实例
* @param bool $shared
*/
public function bind($abstract, $concrete = null, $shared = false)
{
$this->bindings[$abstract]['shared'] = $shared;
$this->bindings[$abstract]['concrete'] = $concrete;
}
public function getBindings()
{
// var_dump($this->bindings);
}
/**
* 解析获取实例
* @param $abstract 标识
* @param array $parameters 参数
* @return mixed 实例
*/
public function make($abstract, $parameters = [])
{
//1 是否存在
if (!$this->has($abstract)) {
new \Exception('你提供的不存在');
}
//2判断是否在共享容器中
if ($this->instances[$abstract]) {
return $this->instances[$abstract];
}
$object = $this->bindings[$abstract]['concrete'];
//3判断是否是闭包
if ($object instanceof \Closure) {
return $object();
}
//4构建实例
if (!is_object($object)) {
$object = new $object(...$parameters);
}
// 5.进行共享
if ($this->bindings[$abstract]['shared']) {
$this->instances[$abstract] = $object;
}
return $object;
}
/**
* 绑定一个单例
* @param $abstract 标识
* @param null $concrete 具体的对象 - 字符串,闭包,实例
* @param bool $shared
*/
public function singleton($abstract, $concrete = null, $shared = true)
{
$this->bind($abstract, $concrete, $shared);
}
/**
* 判断 标识对应的值是否存在
* @param $abstract 标识
* @return bool
*/
public function has($abstract)
{
return isset($this->bindings[$abstract]['concrete']) ||
isset($this->instances[$abstract]['concrete']);
}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
看得我好难受,注释要格式统一,代码缩进也是。