Inject/Injector.php
public function produce($key,$params = array(),$enable_reflect = true){
        //if in data
        if(isset($this->data[$key])) return $this->data[$key];
        //if cached
        if(isset($this->caches[$key])) return $this->caches[$key];
        //if obj/closure
        if(isset($this->objects[$key])){
            $obj = $this->get($key);
            $concrete = $obj[self::INDEX_CONCRETE];
        }else{
            if($this->MUST_REG || !$enable_reflect){
                throw new InjectorException("$key not registered");
            }else{
                $concrete = $key;
                $not_reg = true;
            }
        }
        $result = $this->build($concrete,$params);
        if($not_reg === true || $obj[self::INDEX_CACHED] === true){
            $this->caches[$key] = $result;
        }
        return $result;
    }
public function produce($key,$params = array(),$enable_reflect = true){
        //if in data
        if(isset($this->data[$key])) return $this->data[$key];
        //if cached
        if(isset($this->caches[$key])) return $this->caches[$key];
        //if obj/closure
        if(isset($this->objects[$key])){
            $obj = $this->get($key);
            $concrete = $obj[self::INDEX_CONCRETE];
        }else{
            if($this->MUST_REG || !$enable_reflect){
                throw new InjectorException("$key not registered");
            }else{
                $concrete = $key;
                $not_reg = true;
            }
        }
        $result = $this->build($concrete,$params);
        if($not_reg === true || $obj[self::INDEX_CACHED] === true){
            $this->caches[$key] = $result;
        }
        return $result;
    }
produce a concrete
@param $key
@param $params
@param bool $enable_reflect if $enable_reflect is true,it won't try to reflect for an unmapped concrete
@return mixed|object
@throws InjectorException