2013-05-14 25 views
5

Attualmente sto facendo in questo modo:variabili lazy loading in modelli

function load_template($script, $args){ 
    extract($args); 
    require __DIR__ . '/templates/' . $script; 
} 

Nel mio codice di controllo:

// if home page was requested 
load_template('home.php', array(
    'title' => get_title(), 
    'content' => get_content(), 
    ... 
)); 

Il modello è solo uno script PHP come

<!DOCTYPE html> 
<html> 
<head> 
    <title> <?php echo $title; ?> </titlee> 
... 

Mi stavo chiedendo se è possibile caricare pigro queste variabili in qualche modo, quindi non eseguo effettivamente get_title() o get_content() fino a quando il modello richiede specificamente la variabile.

Potrebbe essere possibile, senza creare un modello parser cosa? Mi piacerebbe molto attaccare con semplici script .php e html come template.


In breve, quello che sto chiedendo è se è possibile auto-assegnare un valore a una variabile solo quando è richiesto prima.

$var = func(); // this should not run 

if($var){  // now the code above should run:) 
    echo $var; // <- the value that was just assigned (don't run func() again) 
} 

risposta

1

A mio parere, se non si desidera modificare il modello per estrarre le variabili, è possibile creare ad esempio una matrice che saprebbe quali variabili esigenze di ogni modello.

Si può considerare una funzione (chiamiamola caller) in cui si passano tutti i parametri e il nome del modello. caller potrebbe scegliere quali variabili sono richieste. Questa idea è come una classe di fabbrica in oop.

penso che ci sia nessun altro modo, ma ...

Mentre l'inserimento di un modello e utilizzare variabili non inesistente, verrà mostrato un messaggio di avviso. Puoi fare in modo che PHP esegua eccezioni negli avvisi e poi nel blocco try ... catch analizzalo. Penso che sia troppo complicato e non vale la pena.

EDIT

La terza idea è quella di creare oggetti invece di array. L'oggetto manterrà tutta la tua variabile $args. Nel modello basta cambiare <?php echo $title; ?> a <?php echo $argument_object->getTitle(); ?> e codificare il metodo getTitle(). Il getTitle(), come metodo non una funzione, sarebbe quindi eseguito solo su richiesta.

Problemi correlati