3

我正在使用PHPcall_user_func_array进行动态调用的功能。我创建了一个函数名称数组及其相应的参数,然后在循环中执行。例如:

$methods = [
    [ 'myfunction1', [$arg1, $arg2] ],
    [ 'myfunction2', [$arg3, $arg4] ],
];

foreach ($methods as $method) {
    call_user_func_array($method[0],$method[1]);
}

虽然这很好用,但我面临的问题是,在我定义$methods数组的那一刻,一些参数尚未定义(例如$arg1$arg4$arg2$arg3没有)但它们是在函数的时间定义的叫。

因此,我正在寻找一种方法来告诉函数在哪里可以找到该参数的值。到目前为止,我想出的是用表示变量名称的字符串替换变量:

$methods = [
     [ 'myfunction1', [$arg1, 'ARG2'] ],
     [ 'myfunction2', ['ARG3', $arg4] ],
];

然后在 foreach 循环中,我遍历每个参数,检查它是否是一个字符串,并且该字符串与一个变量匹配我用该变量的值替换该字符串:

foreach ($methods as $method) {
    foreach ($method[1] as $k => $arg) {
        if (is_string($arg)) {
            $name = strtolower($arg);
            if (isset(${$name})) {
                $method[1][$k] = ${$name};
            }
        }
    }
    call_user_func_array($method[0], $method[1]);
}

虽然这可行,但我想知道 中是否使用了其他已知方法PHP,因为它可能会帮助我改进我的代码。

您是否知道我可以定义动态调用的任何其他方式,其中一些参数在定义时未设置?

4

3 回答 3

1

您可以使用匿名函数作为未知参数,该函数在调用时返回参数的值。这是工作代码:

function myfunction($arg1, $arg2)
{
    echo "\nARGS: $arg1, $arg2";
}

$arg2func = function() {
    return 'foo';
};

$arg3func = function() {
    return 'bar';
};

$arg1 = 'baz';
$arg4 = 'chopchop';

$methods = [
    [ 'myfunction', [$arg1, $arg2func] ],
    [ 'myfunction', [$arg3func, $arg4] ],
];
foreach ($methods as $method) {
    foreach ($method[1] as $k => $arg) {
        if (is_callable($arg)) {
            $method[1][$k] = $arg();
        }
    }
    call_user_func_array($method[0], $method[1]);
}
于 2013-03-05T12:42:36.517 回答
0

为什么你不通过数组给出参数。在您调用的方法中,您可以处理正确的参数以转到自己的方法...

于 2013-03-05T10:48:40.737 回答
0

我最终做的是:
- 将运行时创建的变量定义为字符串:

$methods = [
   [ 'myfunction', [$arg1, arg4] ]
];

- 将在运行时创建的变量存储在数组中 -
添加一个例程,该例程遍历所有参数并查看是否需要替换一些参数:

foreach ($args as $k => $arg) {
    if (is_string($arg)) {
        // pass by reference
        if ($arg[0] == '&') {
            $arg = substr($arg, 1);
            // the vars class array contains the run-time variables
            if (isset($this->vars[$arg])) {
                $args[$k] = &$this->vars[$arg];
            }
        } else {
            if (isset($this->vars[$arg])) {
                $args[$k] = $this->vars[$arg];
            }
        }
    }
}
于 2013-04-01T13:54:21.130 回答