php call_user_func变量错误

时间:2016-12-14 03:01:13

标签: php

我只是想通过一些测试来了解如何解决编码问题。现在,我得到的行为我不明白。

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包含相同的值。

任何人都暗示我让我回到正轨?

4 个答案:

答案 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_funccall_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);