使用__call()将参数传递给一个方法,该方法需要多个但不是数组

时间:2012-04-21 07:36:29

标签: php

我创建了一个__call()方法来动态加载方法。我想解决的一个问题是__call()创建了一个从调用传递的所有参数的数组。这是我的代码

public function __call($method, $params)
{
    if (count($params) <= 1)
            $params = $params[0];

    foreach (get_object_vars($this) as $property => $value) {

        $class = '\\System\\' . ucfirst(str_replace('_', '', $property)) . '_Helper';

        if (strpos($method, str_replace('_', '', $property)) !== false) {

            if (!in_array($class, get_declared_classes()))
                $this->$property = new $class($params);

            $error = $method . ' doesn\'t exist in class ' . $class;

            return (method_exists($class, $method) ? $this->$property->$method($params) : $error);
        }
    }
}

问题是我可以说只有一个参数的数组,但是我的一些方法接受了多个参数,这限制了__call()方法的动态特性。

如何将数组转换为动态传递的方法参数?

所以

array(0 => 'stuff1', 1 => 'stuff2');

可以作为

传递
$this->->helper->test($param1, $param2);

而不是

$this->helper->test($params);

使用当前设计我需要访问参数,如

public function test($params)
{
    print_r($params);
    echo $param[0];
}

但我希望以传统的方式使用它,比如

public function test($param1, $param2)
{
    echo $para1 . " " . $param2;
}

请记住,有些方法需要2个以上的参数,原因是如果我包含不是由我创建的传统样式类方法,我需要将所有参数调用转换为数组索引指针。

编辑:

根据答案

return (method_exists($class, $method) ? call_user_func_array(array($this->$property, $method), $params) : $error);

这会有用吗?

3 个答案:

答案 0 :(得分:4)

可以使用call_user_func_array

完成
call_user_func_array( array($this->$property, $method), $params );

或通过reflection

答案 1 :(得分:0)

您似乎需要call_user_func_array()This comment也很有用。

(另外,考虑抛出异常而不只是返回错误字符串。)

答案 2 :(得分:0)

从 php 5.6 开始,您可以像这样通过新的 splat operator 解压缩参数:

public function __call($method, $params) {
    $result = $this->helper->$method(...$params);
    return $result;
}