2010-04-06 10 views
6

Necesito usar un método de devolución de llamada de clase en una matriz dentro de otro método (la función de devolución de llamada pertenece a la clase).Cómo implementar métodos de devolución de llamada dentro de las clases (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"); 
     } 
} 

¿Es esta la manera correcta de hacerlo? (Es decir, en términos del segundo parámetro pasado a array_map)

Respuesta

9

No creo que desee array_filter, pero array_map

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

pero por otra parte, se puede hacer igual de bien

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

Gracias, tengo los dos confundidos. – Gal

0

array_filter elimina elementos que no satisfacen el predicado. ¿Te refieres a array_map?

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

solución más simple sería pasar el método como la devolución de llamada - ver http://www.php.net/manual/en/language.pseudo-types.php#language.types.callback

Alternativamente, escribir una función de contenedor:

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

Entonces:

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

Sin ofender, pero esto es demasiado complicado y usar funciones estáticas es un mal estilo – Gordon

0

Esto debería funcionar. Puede verificar en la misma función si su parámetro es string o array.

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; 
    } 
Cuestiones relacionadas