src/DdvUtil/Laravel/Proxy/Traits/Proxy.php
public function call($handler, $arguments = null, $parameters = null, $callCalssName = null){
        /**
         * 字符串类调用强转数组
         * 'AA\BB::bb' 转为 ['AA\BB', 'cc']
         */
        if (is_string($handler) && strpos($handler, '::') !== false) {
            // 拆分数组
            list($className, $method) = explode('::', $handler, 2);
            // 如果是可以调用的回调
            if (is_callable(array($className, $method)) || method_exists($className, $method)) {
                // 重写回调
                $handler = array($className, $method);
            }
            // 释放内存
            unset($className, $method);
        }
        /**
         * 试图提取调用的类名
         */
        $className = is_array($handler) && isset($handler[0]) ? $handler[0] : null;
        /**
         * 判断类名是否存在
         */
        if ($className && is_string($className) && class_exists($className)) {
            /**
             * 试图反射方式
             */
            $reflectionMethod = new ReflectionMethod($className, $handler[1]);
            /**
             * 判断是否为静态方法
             * 是的话不需要实例化
             */
            if (!$reflectionMethod->isStatic()) {

                if (!(isset($this->cacheObjCall[$className]) && $this->cacheObjCall[$className] instanceof $className)){
                    $carguments = array();
                    $cparameters = new Parameters([$className, '__construct'], $carguments);
                    $this->argumentsInitByReflectionParameter($carguments, $cparameters);
                    $this->cacheObjCall[$className] = new $className(...$cparameters->getParameters());
                    unset($carguments, $cparameters);
                }
                // 实例化
                $handler = array($this->cacheObjCall[$className], $handler[1]);
            }
            unset($reflectionMethod);
        }
        /**
         * 调用类作用域
         * @var string $newClassScope
         */
        $newClassScope = empty($callCalssName)? get_called_class() : $callCalssName;
        /**
         * 如果第二个参数传入了第三个参数的内容，交换内容
         */
        if (is_object($arguments) && $arguments instanceof ParametersInterface){
            $t = &$parameters;
            unset($parameters);
            $parameters = &$arguments;
            unset($arguments);
            if (is_array($t)){
                $arguments = &$t;
            }else{
                $arguments = $parameters->getParameters();
            }
            unset($t);
        }
        /**
         * 确保第二个参数是一个数组
         */
        if (!is_array($arguments)){
            $arguments = array();
        }
        /**
         * 必须有一个解析参数的参数
         */
        if (!(isset($parameters)&&$parameters instanceof ParametersInterface)){
            $parameters = new Parameters($handler, $arguments);
        }
        $this->argumentsInitByReflectionParameter($arguments, $parameters);
        return call_user_func_array(
            Closure::bind(
                function ($handler, $arguments){
                    return call_user_func_array($handler, $arguments);
                },
                null,
                $newClassScope),
            [$handler, $arguments]
        );
    }
public function call($handler, $arguments = null, $parameters = null, $callCalssName = null){
        /**
         * 字符串类调用强转数组
         * 'AA\BB::bb' 转为 ['AA\BB', 'cc']
         */
        if (is_string($handler) && strpos($handler, '::') !== false) {
            // 拆分数组
            list($className, $method) = explode('::', $handler, 2);
            // 如果是可以调用的回调
            if (is_callable(array($className, $method)) || method_exists($className, $method)) {
                // 重写回调
                $handler = array($className, $method);
            }
            // 释放内存
            unset($className, $method);
        }
        /**
         * 试图提取调用的类名
         */
        $className = is_array($handler) && isset($handler[0]) ? $handler[0] : null;
        /**
         * 判断类名是否存在
         */
        if ($className && is_string($className) && class_exists($className)) {
            /**
             * 试图反射方式
             */
            $reflectionMethod = new ReflectionMethod($className, $handler[1]);
            /**
             * 判断是否为静态方法
             * 是的话不需要实例化
             */
            if (!$reflectionMethod->isStatic()) {

                if (!(isset($this->cacheObjCall[$className]) && $this->cacheObjCall[$className] instanceof $className)){
                    $carguments = array();
                    $cparameters = new Parameters([$className, '__construct'], $carguments);
                    $this->argumentsInitByReflectionParameter($carguments, $cparameters);
                    $this->cacheObjCall[$className] = new $className(...$cparameters->getParameters());
                    unset($carguments, $cparameters);
                }
                // 实例化
                $handler = array($this->cacheObjCall[$className], $handler[1]);
            }
            unset($reflectionMethod);
        }
        /**
         * 调用类作用域
         * @var string $newClassScope
         */
        $newClassScope = empty($callCalssName)? get_called_class() : $callCalssName;
        /**
         * 如果第二个参数传入了第三个参数的内容，交换内容
         */
        if (is_object($arguments) && $arguments instanceof ParametersInterface){
            $t = &$parameters;
            unset($parameters);
            $parameters = &$arguments;
            unset($arguments);
            if (is_array($t)){
                $arguments = &$t;
            }else{
                $arguments = $parameters->getParameters();
            }
            unset($t);
        }
        /**
         * 确保第二个参数是一个数组
         */
        if (!is_array($arguments)){
            $arguments = array();
        }
        /**
         * 必须有一个解析参数的参数
         */
        if (!(isset($parameters)&&$parameters instanceof ParametersInterface)){
            $parameters = new Parameters($handler, $arguments);
        }
        $this->argumentsInitByReflectionParameter($arguments, $parameters);
        return call_user_func_array(
            Closure::bind(
                function ($handler, $arguments){
                    return call_user_func_array($handler, $arguments);
                },
                null,
                $newClassScope),
            [$handler, $arguments]
        );
    }
调用
@param array|callable|Closure|string $handler
@param array|ParametersInterface $arguments
@param ParametersInterface $parameters
@param string|null $callCalssName
@return mixed
@throws ProxyExceptions
@throws ReflectionException