Questo è più di un 'Come dovrebbe I?' piuttosto che "Come do I?" domanda.PHP: best practice per il passaggio di variabili ad includere file
In genere, qual è il modo migliore per passare le variabili a un file incluso?
Ad esempio, supponiamo che io stia utilizzando un frammento per un menu e che uno degli elementi del menu (quello corrente) abbia un determinato nome di classe (questo è un esempio molto generico - non qualcosa che sono effettivamente utilizzando):
<?php
$links = array(
array('text' => 'home', 'href' => 'home.php'),
array('text' => 'about', 'href' => 'about.php'),
array('text' => 'contact', 'href' => 'contact.php')
);
?>
<ul>
<?php for($i = 0; $i < 3; $i++) :
$link = $links[$i];
$is_active = ($i == $active_index);
?>
<li><a <?=($is_active ? 'class="active"' : '')?> href="<?=$link['href']?>"><?=$link['text']?></a></li>
<?php endfor; ?>
</ul>
chiamerò il precedente 'menu.inc.php'. ovviamente sta cercando una variabile (int) chiamata $active_index
per determinare a quale collegamento assegnare la classe '.active'.
così - si poteva semplicemente definire $active_index
prima di chiamare l'inclusione, ma questo mi sembra una cattiva pratica dal momento che forse una variabile di quel nome potrebbe essere stata definita per qualcos'altro prima e una parte successiva dello script è ancora in cerca di esso.
o - si potrebbe usare un percorso assoluto e aggiungere variabili utilizzando una querystring (include 'menu.inc.php?active_index=1'
), ma ancora una volta che sembra una cattiva idea, dato che potrebbe essere necessario il 'reale' $_GET
all'interno di un dato include
.
o - si potrebbe iniziare ogni inclusi file con ob_start
e tornare ob_end_clean()
, quindi usare qualcosa di simile a questo per ottenere il ritorno:
function load_view($file, $variables){
extract($variables);
return include($file);
}
// passed like
<?=load_view('menu.inc.php', array('active_index' => 2))?>
ma anche questo sembra avere un certo numero di svantaggi (dover ristrutturare tutto i file include di conseguenza con le funzioni ob
e una dichiarazione return
).
Questo è simile all'approccio adottato nelle viste Zend Framework. Il controller imposta il modello nella vista ('ViewMenu' assume sia il controller che i ruoli del modello sopra) e quindi esegue uno script di visualizzazione tramite' include' all'interno del metodo 'render()' della vista. È possibile ottenere lo stesso effetto sopra rilasciando la variabile locale '$ active_link' e accedendola nello script incluso usando' $ this-> active_link'. –