PHP错误:方法名称必须是字符串

时间:2010-11-14 10:22:37

标签: php

我发现了一个关于此问题的错误报告(http://bugs.php.net/bug.php?id=24286)虽然我不确定它是否与我的问题相关并且它已经很老了。这是我的代码:

class RegExp {
    function name($e){ .... }
    function email($e){ .... }
    function phone($e){ .... }
}    

$regexp = new RegExp();
$final_keys= array("name", "email", "phone");

for($index=0; $index < count($final_keys); $index ++){
    if(!$regexp->$final_keys[$index]($_POST[$final_keys[$index]])){
        $invalid_uri_vars .= $final_keys[$index].",";
    }
    else{
        $uri_vars = "&".$final_keys[$index]."=".$_POST[$final_keys[$index]];
    }
}

它的作用是使用数组中的值作为要调用的方法的名称。换句话说,我正在尝试使用变量$final_keys[$index]作为名称来实现函数调用。

* 更新:我尝试实施以下建议,似乎没有任何效果。这是我建议的修改之一:

for($key=0; $key < count($final_keys); $key ++){
    if(!$regexp->{$final_keys[$key]}($_POST[$final_keys[$key]])){
        $invalid_uri_vars .= $final_keys[$key].",";
    }
    else{
        $uri_vars = "&".$final_keys[$key]."=".$_POST[$final_keys[$key]];
    }
}

我收到与原始代码相同的错误。使用call_user_func的另一种方法,但我不确定它是否正确:

for($key=0; $key < count($final_keys); $key++){
    if(!call_user_func(array($regexp, $final_keys[$key]), $_POST[$final_keys[$key]])){
        $invalid_uri_vars .= $final_keys[$key].",";
    }
    else{
        $uri_vars = "&".$final_keys[$key]."=".$_POST[$final_keys[$key]];
    }   
}

我收到此错误:Warning: call_user_func(Array) [function.call-user-func]: First argument is expected to be a valid callback in /.........testreqmeta.php on line 91

3 个答案:

答案 0 :(得分:1)

从您的链接引用:

  

好的,这是解决此问题的一些方法:   在

的情况下
<?
class Test {
    var $var = Array('test_function');
    function test_function($echo_var) {
        echo $echo_var;
    }
}

$test_obj = new test;
$test_obj->var[0]('bla');
?>
     

您可以使用此代码避免在最后一个字符串中出现致命错误:

<?
$test_obj->{$test_obj->var[0]}('bla');
?>

那么:

if($regexp->{$final_keys[$index]}($_POST[$final_keys[$index]])){

答案 1 :(得分:1)

在尝试示例代码时,我仍然没有收到任何错误(第二个示例中未定义的$key除外),因此我无法确定是什么会修复它,但这是一种方法,简化了事情并摆脱了数组索引操作:使用foreach循环而不是for循环。

$query = array();
foreach ($final_keys as $key) {
    if(!$regexp->$key($_POST[$key])) {
        $invalid_uri_vars[] = $key;
    } else {
        $query[] = "$key={$_POST[$key]}";
    }
}
$uri_vars = implode('&', $query);

我还用数组内爆替换了重复的字符串附加,这应该稍微高一些。如果需要,它还可以在提交之前更轻松地进一步处理查询字符串。还有更好的方法,但这是另一个主题。

NB。 RegExp不是对类所做的很好的描述,因此它不是一个很好的名字。该类可能使用正则表达式,但它本身不是正则表达式(支持诸如“匹配”和“替换”之类的操作; RegExp的API没有这些表达式。

答案 2 :(得分:0)

有一个函数可以帮助您实现call_user_func

http://de2.php.net/manual/en/function.call-user-func.php