2010-11-14 64 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]])){ 
相關問題