我发现了一个关于此问题的错误报告(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
答案 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
: