2010-11-14 65 views
0

我发现了一个关于这个错误报告(http://bugs.php.net/bug.php?id=24286),虽然我不确定它是否与我的问题有关这是非常古老的。这是我的代码:PHP错误:方法名称必须是字符串

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

+0

您使用的是哪个版本的PHP?上述代码在充实之后(示例代码应该是[self-contained](http://sscce.org/#selfcon))在PHP 5.3.2下运行时不会在您的标题中产生错误。最好还包括错误以及在帖子正文中哪一行生成该错误的指示,以便不会对发生的事情造成混淆。 – outis 2010-11-14 10:38:49

+0

我正在测试活动网站上的代码 - 子文件夹中的某处。该网站托管在hostgator上,我认为... – Joann 2010-11-14 13:32:42

+0

这并不回答我的问题。如果您不确定您的主机运行哪个PHP版本,您可以使用['phpversion'](http://php.net/phpversion)查找。为了解决代码问题,该问题需要[重现](http://tinyurl.com/so-hints)。现在,事实并非如此。您的问题中缺少一些重要信息。另外,第二个示例(使用括号)在'$ index'上循环,但在循环体中使用'$ key'。如果这代表了您的实际代码,那么您指的是一个未定义的变量('$ key'),这会导致警告。 – outis 2010-11-15 05:12:03

回答

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没有这些)。

+0

这工作非常好,谢谢! 问题:这条线是什么 '$ query [] =“$ key = {$ _ POST [$ key]}”;'do?特别是双引号。它会导致像这样'$ query = array(“key”=>“value”);'对吗? – Joann 2010-11-16 15:26:50

+0

不会。它创建一个字符串,而不是一个数组。花括号用于[复杂语法](http://php.net/manual/en/language.types.string.php#language.types.string.parsing.complex)。空方括号用于[自动索引](http://php.net/manual/en/language.types.array.php)。为了在数组中存储一个键和值,我会使用'$ query [$ key] = $ value',而不是'$ query = array($ key,$ value)',除非在特殊情况下。 – outis 2010-11-17 04:38:57

1

从你的链接引用:

ok, here is some workaround on this problem: in case of

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

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

you can avoid Fatal error in last string using this instead:

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

那么接下来:

if($regexp->{$final_keys[$index]}($_POST[$final_keys[$index]])){ 
相关问题