2010-04-06 44 views
6

我需要在另一個方法(回調函數屬於類)內的數組上使用類回調方法。如何實現類內部的回調方法(PHP)

class Database { 

     public function escape_string_for_db($string){ 
      return mysql_real_escape_string($string); 
     } 

     public function escape_all_array($array){ 
      return array_map($array,"$this->escape_string_for_db"); 
     } 
} 

這是正確的方法嗎? (我的意思是,在傳遞給array_map第二個參數而言)

回答

9

我不認爲你想array_filter,但array_map

return array_map(array($this, 'escape_string_for_db'), $array); 

但話又說回來,你可以如做

return array_map('mysql_real_escape_string', $array); 
+0

謝謝,我弄糊塗了。 – Gal 2010-04-06 11:32:18

0

array_filter刪除不滿足謂詞的元素。你的意思是array_map

return array_map(array($this, "escape_string_for_db"), $array); 
-1

最簡單的解決辦法是通過該方法作爲回調 - 見http://www.php.net/manual/en/language.pseudo-types.php#language.types.callback

或者,寫一個包裝函數:

function wrap_callback($target, $use_obj=false) 
{ 
    static $obj; 
    if ($use_obj) { 
    if (method_exists($target, 'callback')) { 
     $obj=$target; 
     return true; 
    } else { 
     trigger_error("callback declared for something with no callback method"); 
     return false; 
    } 
    } 
    return $obj->callback($target); 
} 

然後:

class Database { 

    public callback($string){ 
     return mysql_real_escape_string($string); 
    } 

    public function escape_all_array($array){ 
     wrap_callback($this, true); // register callback 
     return array_filter($array,"wrap_calback"); 
    } 
} 

Ç 。

+1

沒有冒犯,但這是過於複雜,並且在函數中使用靜態是不好的風格 – Gordon 2010-04-06 11:39:24

0

這應該工作。你可以在相同的函數中檢查你的參數是字符串還是數組。

class Database { 

    public function escape_string_for_db($data) 
    { 
    if(!is_array($data)) 
    { 
     $data =mysql_real_escape_string($data); 
    } 
    else 
    { 
     //Self call function 
     $data = array_map(array('Database ', 'escape_string_for_db'), $data); 
    } 
    return $data; 
    }