我只是想通过一些测试来了解如何解决编码问题。现在,我得到的行为我不明白。
function product($a, $b) {
echo "Yo ".$a;
echo "Yo ".$b;
}
call_user_func('product', 'dd', 'lizzy');
上述作品
$variablename = "'product','dd','lizzy'";
call_user_func($variablename);
抛出错误:
警告:call_user_func()期望参数1是有效的回调,函数''产品','dd','lizzy''未找到或函数名称无效
显然$ variablename包含相同的值。
任何人都暗示我让我回到正轨?
答案 0 :(得分:1)
添加您没有精确显示的内容,您的第二次尝试看起来像这样:
9999.99
执行第二行时,$variablename = "'product', 'dd', 'lizzy'";
call_user_func($variablename);
是唯一的参数,而$variablename
则需要三个。
所以你得到的错误很正常! 绝对不能指望一个参数被“分派”到几个参数中。
答案 1 :(得分:1)
如果查看PHP Docs on call_user_func,您应该会看到它至少需要一个参数 - 并且第一个参数必须是callable类型。
显然$ variablename包含相同的值。
不确定这是多么明显。代码中没有任何内容定义此值。它应该指定一些函数或对象和方法(参见上面的可调用链接)。
答案 2 :(得分:1)
从错误说明;
第一个参数需要是有效的回调/函数名。
当您按照上面提到的那样设置$variablename
时,请确保它会被设置为错误。
"'product', 'dd', 'lizzy'
在您的情况下,它不是有效的回调名称。
答案 3 :(得分:1)
注意call_user_func
和call_user_func_array
的签名。
function product($a, $b) {
echo "Yo ".$a;
echo "Yo ".$b;
echo "<br>\n";
}
// there are 3 single arguments
call_user_func('product', 'dd', 'lizzy');
// the same with variables
$fn_name = 'product';
$arg1 = 'dd';
$arg2 = 'lizzy';
call_user_func($fn_name, $arg1, $arg2);
// or give ARGUMENS ONLY as array, but function name as string scalar
$args = array($arg1, $arg2);
call_user_func_array($fn_name, $args);
// if you for some reason need to handle a single array for the name and arguments in one,
// you need to write your own function:
function call_user_func_array2($call_info)
{
$fn_name = array_shift($call_info); //extract first item
call_user_func_array($fn_name, $call_info);
}
$call_info = array($fn_name, $arg1, $arg2);
call_user_func_array2($call_info);
此外,我们可以扩展上面的代码来处理给定的字符串"'product','dd','lizzy'"
。 (例如,在某种数据库中以这种形式存储的情况下)
首先需要在此字符串中提取逗号分隔值。您可以通过正则表达式str_getcsv
或更灵活地实现此目的。假设它用逗号分隔,带有可选的空格,并用单个或双qoutes括起来。正则表达式可能如下所示:(?:^|,)\s*(['"])(.+?)\1\s*?(?=,|$)
。 2 nd子分页(.+?)
将捕获单引号/双引号内的所有内容。
结合call_user_func_array2
看起来像是:
function call_user_func_string($call_info)
{
if(!preg_match_all('~(?:^|,)\s*([\'"])(.+?)\1\s*?(?=,|$)~u', $call_info, $matches))
throw new Exception("call_user_func_string expects parameter 1 to be a string like `'functionname','arg1','arg2' [,...]` "
. 'or `"functionname","arg1","arg2" [,...]`.');
call_user_func_array(array_shift($matches[2]), $matches[2]);
}
// some differently formatted examples
$my_string = "'product','dd','lizzy'";
call_user_func_string($my_string);
$my_string = ' "product" , "dd" , "lizzy" ';
call_user_func_string($my_string);
$my_string = <<<'_END_'
'product' , "dd",'lizzy' ,"lucy's cat"
_END_;
call_user_func_string($my_string);