2010-04-06 5 views
6

Ich muss eine Klasse Rückrufmethode für ein Array innerhalb einer anderen Methode verwenden (die Callback-Funktion gehört zu der Klasse).Wie implementiert man Callback-Methoden in Klassen (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"); 
     } 
} 

Ist das der richtige Weg? (Ich meine, in Bezug auf den zweiten Parameter übergeben array_map)

Antwort

9

Ich glaube nicht, dass du array_filter wollen, aber array_map

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

aber dann wieder, können Sie genauso gut tun

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

Danke, ich habe die beiden verwirrt. – Gal

0

array_filter löscht Elemente, die das Prädikat nicht erfüllt. Meinst du array_map?

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

Simplest Lösung wäre, das Verfahren als Callback zu passieren - siehe http://www.php.net/manual/en/language.pseudo-types.php#language.types.callback

Alternativ schreibt eine Wrapper-Funktion:

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); 
} 

Dann:

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"); 
    } 
} 

C

+1

Nichts für ungut, aber das ist zu kompliziert und die Verwendung von statischen in Funktionen ist schlecht Stil – Gordon

0

Dies sollte funktionieren. Sie können in der gleichen Funktion überprüfen, ob Ihr Parameter String oder Array ist.

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; 
    } 
Verwandte Themen