2010-09-28 11 views
11

Tengo un código PHP 5.3 que crea una matriz para pasar a una vista. Este es el código que tengo.Conversión de código con funciones anónimas a PHP 5.2

# Select all this users links. 
$data = $this->link_model->select_user_id($this->user->id); 
if (count($data) > 0) { 
    # Process the data into the table format. 
    $table = array 
    (
     'properties' => array 
     (
      'delete_link_column' => 0, 
     ), 
     'callbacks' => array 
     (
      # Callback for the name link. 
      function($value) { 
       return sprintf('<a href="/links/view/name/%s">%s</a>', $value, $value); 
      }, 
      # Callback for the category link. 
      function($value) { 
       return sprintf('<a href="/category/view/name/%s">%s</a>', $value, $value); 
      }, 
      # Callback for the creation date. 
      function($value) { 
       return date('jS M Y', $value); 
      }, 
      # Callback for the delete link. 
      function($value) { 
       return sprintf('<a href="links/delete/name/%s">delete</a>', $value); 
      }, 
     ), 
     'columns' => array 
     (
      'name', 'category', 'creation date', 
     ), 
     'data' => array 
     (

     ), 
     'sorting' => array 
     (
      'sort' => false, 
     ), 
    ); 

Sin embargo el problema es que no puedo utilizar funciones anónimas en PHP 5.2, que es el servidor debo subir este trabajo escolar. La vista requiere que se definan las funciones de devolución de llamada para que pueda llamarlas.

¿Cuál sería la mejor forma de convertir este código PHP para no usar funciones anónimas? Gracias.

+1

¿Cuándo y cómo y por qué se llaman estas devoluciones de llamada? – deceze

+0

@deceze Esta matriz se pasa a una vista que procesa la matriz y crea una tabla a partir de los datos. Las devoluciones de llamada se llaman para los datos en cada columna para formatear los datos. Así que si un valor de celda de tabla era 'Barcos' en la primera columna, la vista lo procesaría en el valor 'Boats No quería cambiar la vista porque tengo muchos controladores que lo usan así. – NeedsEducation

Respuesta

8

Se podría llamar a uno de los función de este modo:

$func = $callbacks[0]; 
$func(); 

que también trabaja con create_function() y el uso de cadenas para funciones con nombre, así:

function test() { 
    echo "test"; 
} 
$func = 'test'; 
$func(); 

$func = create_function('' , 'echo "test 2"; '); 
$func(); 

Además, si la llamada se realiza utilizando call_user_func puede usar array($object, 'func_name') para llamar a un método público en un objeto o una clase con array('Class_Name', 'func_name'):

class Test { 
    public static function staticTest() { echo "Static Test"; } 
    public function methodTest() { echo "Test"; } 

    public function runTests() { 
    $test = array('Test', 'staticTest'); 
    call_user_func($test); 

    $test = array($this, 'methodTest'); 
    call_user_func($test); 
    } 
} 

$test = new Test(); 
$test->runTests(); 
+0

Gracias justo lo que necesitaba. – NeedsEducation

7

Las funciones anónimas son geniales para las efemérides efímeras, como los oyentes de eventos en patrones como Observer.

Sin embargo, dado que ya ha formalizado una interfaz (devoluciones de nombres de representación, categorías, fechas de creación y un enlace de eliminación), también puede dar el paso adicional de definir una interfaz 'renderizadora' que requiera esos 4 métodos A ser implementado. En lugar de pasar retrollamadas pasaría una única subclase de renderizador a la vista, que luego podría usarse para llamar a los métodos apropiados. La vista también podría validar comprobando la clase principal. Eso aún le permitiría intercambiar renderizadores en el espíritu de OOP portátil reutilizable sin requerir funciones anónimas.

¿Existe alguna situación en la que las devoluciones de llamadas provengan de código arbitrario (por ejemplo, complementos)? De lo contrario, no hay ningún beneficio en hacer que esas devoluciones de llamada sean anónimas. Puede parecer que está guardando un poco de abotagamiento en el espacio de nombres, pero también está dificultando la depuración o el documento.

+3

+1 por sugerir un método OOP más limpio ... ¿Podría quizás utilizar un ejemplo de fuente? – gnarf

+0

I Jeff, gracias por la respuesta, lo que dices tiene mucho sentido. Lamento no haber marcado su respuesta como correcta, las dos respuestas que he recibido son correctas (y la próxima vez lo haría de la manera en que usted está hablando). – NeedsEducation

+0

¡Ningún problema! Me alegra que ambos podamos ayudar. :) –

Cuestiones relacionadas