2010-10-10 57 views
4

我有一個數組,並希望通過array_walk陣列中的每個成員上應用MySQLi->real_escape_string,但是這是行不通的:PHP回調函數不工作的目標函數

array_walk($array, '$mysqli->real_escape_string'); 

它給出了這樣的錯誤:

Warning: array_walk() expects parameter 2 to be a valid callback, function '$mysqli->real_escape_string' not found or invalid function name in C:\wamp\www\ts.php on line 69

$mysqli是一個有效的對象,如果我在其他任何地方做$mysqli->real_escape_string('anything'),它都可以正常工作。

我的問題:不可能將對象的函數作爲回調函數傳遞嗎?或者我做錯了什麼。


重要:我知道我可以創建自己的回調函數,並實現$ mysqli->在它我想知道是不是可以使用回調作爲一個對象的功能real_escape_string?

回答

8

正如你可以在php callback頁面讀取,您應使用:

# produces an error 
array_walk($array, array($msqli, 'real_escape_string')); 
array_map($array, array($msqli, 'real_escape_string')); 
+0

不,不起作用。它說:'警告:array_walk()期望參數2是一個有效的回調,非靜態方法mysqli :: real_escape_string()不能被靜態調用' – WhatIsOpenID 2010-10-10 15:44:40

+1

這是用引號,當正確使用你寫的,它說:'警告:mysqli :: real_escape_string()期望完全1個參數,2給出' – WhatIsOpenID 2010-10-10 15:46:41

+3

隨着array_map,它似乎工作(http://www.php.net/manual/en/function.array-map.php#63279) – Aif 2010-10-10 15:47:45

0

array_walk將只允許一個用戶定義的函數作爲回調,而不是核心PHP函數或方法傳遞。爲此,我將嘗試以下方法:

foreach($array as &$value) { 
    $value = $mysqli->real_escape_string($value); 
} 

通過引用傳遞的值允許它foreach循環內進行修改,從而在所述陣列的每個成員被轉義。

+0

我知道我可以做到這一點。我只是問有沒有辦法傳遞非靜態方法? – WhatIsOpenID 2010-10-10 15:47:14

+0

問題出在array_walk上,因爲它只能與用戶定義的函數或方法一起使用。按照Aif的說法嘗試array_map,將對象和方法名稱作爲Aif傳遞給數組。 – Jeremy 2010-10-10 15:54:25

9

如果您的呼叫對象內的方法,你應該通過在陣列中,第一項是所述對象/背景,然後第二應是方法:

小例子

function callback() 
{ 
    //blah 
} 

上面是調用的函數和應該被稱爲像這樣:array_walk($array, 'callback');

class object() 
{ 
    public function callback() 
    { 
    } 
} 

上述回調被調用的方法,其幾乎相同的功能,但b它有一個父上下文類中ecause的,所以應該被稱爲像這樣:

$object = new object(); 
array_walk($array, array($object , 'callback')); 

MySQLi的定向庫中的對象,以便在您初始化您的mysqli對象,你應該叫「方法」,例如:

array_walk($array, array($msqli, 'real_escape_string')); 

而且如上所述,array_walk會走兩個鍵和值到MySQL的對象女巫會導致精確逃避,你應該使用array_map步行僅值:

array_map($array, array($msqli, 'real_escape_string'));