2010-09-28 2 views
11

Ho un codice PHP 5.3 che crea una matrice da passare a una vista. Questo è il codice che ho.Conversione di codice con funzioni anonime in 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, 
     ), 
    ); 

Tuttavia il problema è che non posso utilizzare funzioni anonime in PHP 5.2, che è il server devo caricare il lavoro scolastico. La vista richiede che le funzioni di callback siano definite in modo che possano chiamarle.

Quale sarebbe il modo migliore per convertire questo codice PHP in non utilizzando funzioni anonime? Grazie.

+1

Quando e come e perché vengono chiamati i callback? – deceze

+0

@deceze Questa matrice viene passata a una vista che elabora la matrice e crea una tabella dai dati. I callback vengono chiamati per i dati in ogni colonna per formattare i dati. Quindi se un valore di cella di tabella era "Barche" nella prima colonna, la vista lo elaborerebbe nel valore "Boats Non volevo davvero cambiare la vista perché ho un sacco di controllori che la usano in questo modo. – NeedsEducation

risposta

8

Si potrebbe chiamare una di quelle funzioni in questo modo:

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

che funziona anche con create_function() e l'utilizzo di stringhe per le funzioni denominate in questo modo:

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

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

Inoltre, se la chiamata viene effettuata utilizzando call_user_func è possibile utilizzare array($object, 'func_name') per chiamare un metodo pubblico su un oggetto o una classe 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

Grazie proprio quello di cui avevo bisogno. – NeedsEducation

7

Le funzioni anonime sono ideali per le singole edizioni effimere, come gli ascoltatori di eventi in modelli come Observer.

Tuttavia, dal momento che hai già formalizzato un'interfaccia (callback per il rendering di nomi, categorie, date di creazione e un collegamento di eliminazione) puoi anche fare il passo in più della definizione di un'interfaccia 'renderer' che richiede quei 4 metodi da implementare. Invece di passare i callback si passerebbe una singola sottoclasse di rendering alla vista, che potrebbe quindi essere utilizzata per chiamare i metodi appropriati. La vista potrebbe anche convalidarla controllando la classe genitore. Ciò consentirebbe comunque di scambiare i renderer nello spirito di OOP portatile riutilizzabile senza richiedere funzioni anonime.

Esiste una situazione in cui i vostri callback provengono da codice arbitrario (ad esempio plug-in)? In caso contrario, non c'è davvero alcun vantaggio nel rendere anonimi tali callback. Potrebbe sembrare che stai risparmiando un piccolo spazio dei nomi gonfio, ma lo stai anche rendendo più difficile eseguire il debug o documentare.

+3

+1 per suggerire un metodo OOP più pulito ... Potrebbe forse usare un esempio di fonte? – gnarf

+0

I Jeff, grazie per la risposta, quello che stai dicendo ha molto senso. Scusa se non ho contrassegnato la tua risposta come corretta, entrambe le risposte che ho ricevuto sono corrette (e la prossima volta lo farei nel modo in cui stai parlando). – NeedsEducation

+0

Nessun problema! Sono felice che potremmo aiutare entrambi. :) –