一、白话解释一下
所谓注册树也就是在一棵树上种上果子(对象),吃的时候直接在树上去摘,是不是很方便了
二、看看代码吧
class Register
{
public static $obj = [];
public static function set($type,$obj)
{
self::$obj[$type] = $obj;
}
public static function get($type)
{
return self::$obj[$type];
}
public static function _unset($type){
unset(self::$obj[$type]);
}
}
class A{
}
class B{
}
Register::set('A',new A);
Register::set('B',new B);
var_dump(Register::get('A'));
三、TP5中的容器
class Container
{
protected static $instance; //容器对象实例
protected $instances = [];//容器中的对象实例
protected $name = [];//容器标识别名
public static function getInstance()//获取当前容器的实例(单例)
{
if (is_null(static::$instance)) {
static::$instance = new static;
}
return static::$instance;
}
public static function setInstance($instance)//设置当前容器的实例
{
static::$instance = $instance;
}
/**
* 获取容器中的对象实例
* @access public
* @param string $abstract 类名或者标识
* @param array|true $vars 变量
* @param bool $newInstance 是否每次创建新的实例
* @return object
*/
public static function get($abstract, $vars = [], $newInstance = false)
{
return static::getInstance()->make($abstract, $vars, $newInstance);
}
/**
* 绑定一个类、闭包、实例、接口实现到容器
* @access public
* @param string $abstract 类标识、接口
* @param mixed $concrete 要绑定的类、闭包或者实例
* @return Container
*/
public static function set($abstract, $concrete = null)
{
return static::getInstance()->bindTo($abstract, $concrete);
}
/**
* 绑定一个类、闭包、实例、接口实现到容器
* @access public
* @param string|array $abstract 类标识、接口
* @param mixed $concrete 要绑定的类、闭包或者实例
* @return $this
*/
public function bindTo($abstract, $concrete = null)
{
if (is_array($abstract)) {
$this->bind = array_merge($this->bind, $abstract);
} elseif ($concrete instanceof Closure) {
$this->bind[$abstract] = $concrete;
} elseif (is_object($concrete)) {
if (isset($this->bind[$abstract])) {
$abstract = $this->bind[$abstract];
}
$this->instances[$abstract] = $concrete;
} else {
$this->bind[$abstract] = $concrete;
}
return $this;
}
}
四、叨叨一下
所述完全根据自己的理解白话化,肯定有欠妥之处,欢迎来人朋友指正。