转换参数对应于函数参数

时间:2015-02-12 04:14:13

标签: php

arg.php

<?php

include 'libs/Arg.php';

$method = 'test';
$params = $_REQUEST;

$arg = new Arg;
$arg->{$method}($params);

库/ Arg.php

<?php

class Arg
{
    public function test($arguments)
    {
        extract($arguments);
        echo $name;
        echo $age;
    }
}

我想使用arg.php作为ajax适配器,通过方法名称调用类函数,但是在函数$arguments中将是不明确的,我可以转换参数并使其对应于函数参数吗?

2 个答案:

答案 0 :(得分:2)

你可以在

的帮助下实现它
call_user_func_array() 

例如,如果你有参数名称和年龄,那么你可以写这样的函数

      public function test($name,$age) {
      }

arg.php

include 'libs/Arg.php';
$method = 'test';
$params = $_REQUEST;

$arg = new Arg;
call_user_func_array(array($arg,$method), $params);

库/ Arg.php

class Arg
{
    public function test($name,$age)
    {
        echo $name;
        echo $age;
    }
}

因此您不需要使用$ arguments并将其解压缩。正如你在帖子中提到的那样,它含糊不清。希望这会对你有所帮助。

答案 1 :(得分:0)

通过位置传递参数可以使用call_user_func_array轻松完成。

如果要将名称与名称匹配,则需要使用一些reflection

$method = 'test';
$params = $_REQUEST;

$obj = new Arg;
$ref = new ReflectionMethod($obj, $method);

$arguments = array_map(
    function (ReflectionParameter $param) use ($params) {
        if (isset($params[$param->getName()])) {
            return $params[$param->getName()];
        }
        if ($param->isOptional()) {
            return $param->getDefaultValue();
        }
        throw new InvalidArgumentException('Missing parameter ' . $param->getName());
    },
    $ref->getParameters()
);

$ref->invokeArgs($obj, $arguments);