我正在使用PHP
和call_user_func_array
功能进行动态调用。我创建了一个函数名称数组及其相应的参数,然后在循环中执行。 e.g:
$methods = [
[ 'myfunction1', [$arg1, $arg2] ],
[ 'myfunction2', [$arg3, $arg4] ],
];
foreach ($methods as $method) {
call_user_func_array($method[0],$method[1]);
}
虽然这很好用,但我面临的问题是,在我定义$methods
数组的那一刻,一些参数尚未定义(例如$arg1
,{{1} } has,$arg4
和$arg2
没有)但它们是由函数调用的时间定义的。
因此,我正在寻找一种方法来告诉函数在哪里找到该参数的值。到目前为止,我想到的是用表示变量名称的字符串替换变量:
$arg3
然后在foreach循环中,我遍历每个参数,检查它是否是一个字符串,并且该字符串匹配一个变量我将该字符串替换为该变量的值:
$methods = [
[ 'myfunction1', [$arg1, 'ARG2'] ],
[ 'myfunction2', ['ARG3', $arg4] ],
];
虽然这有效,但我想知道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]);
}
中是否还有其他已知方法,因为它可能会帮助我改进代码。
您是否知道我可以定义动态调用的任何其他方式,其中一些参数在定义时未设置?
答案 0 :(得分: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]);
}
答案 1 :(得分:0)
为什么你不通过数组给args。在你的被调用方法中,你可以处理正确的args去自己的方法......
答案 2 :(得分:0)
我最终做的是这样的:
-define变量在运行时创建为字符串:
$methods = [
[ 'myfunction', [$arg1, arg4] ]
];
-store在运行时在数组中创建的变量
- 添加一个例程,遍历所有参数并查看是否需要替换某些参数:
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];
}
}
}
}