Esto es más de un '¿Cómo debería I?' en lugar de '¿Cómo do I?' pregunta.PHP - La mejor práctica para pasar variables para incluir archivos
En general, ¿cuál es la mejor manera de pasar variables a un archivo incluido?
Por ejemplo, supongamos que estoy usando un fragmento para un menú, y quiero que uno de los elementos del menú (el actual) tenga un cierto nombre de clase (esta es una muestra muy genérica, no es algo que yo soy en realidad usando):
<?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>
Llamaré al 'menú.inc.php' anterior. obviamente está buscando una variable (int) llamada $active_index
para determinar a qué enlace dar la clase '.active'.
así que podría simplemente definir $active_index
antes de llamar al include, pero esto me parece una mala práctica ya que tal vez una variable de ese nombre podría haber sido definida para algo más anterior y una parte posterior del script todavía está buscando eso.
o - se puede utilizar una ruta absoluta y añadir variables utilizando una cadena de consulta (include 'menu.inc.php?active_index=1'
), pero de nuevo que parece una mala idea ya que es posible que tenga la 'verdadera' $_GET
dentro de cualquier include
dada.
o - se puede empezar cada incluía archivo con ob_start
y volver ob_end_clean()
, a continuación, utilizar algo como esto para conseguir el retorno:
function load_view($file, $variables){
extract($variables);
return include($file);
}
// passed like
<?=load_view('menu.inc.php', array('active_index' => 2))?>
pero de nuevo esto parece tener una serie de desventajas (tener que reestructurar toda Incluya sus archivos de acuerdo con las funciones ob
y una declaración return
).
Esto es similar al enfoque adoptado en las vistas de Zend Framework. El controlador configura el modelo en la vista ('ViewMenu' asume los roles de controlador y modelo anteriores) y luego ejecuta una secuencia de comandos de vista a través de' include' dentro del método 'render()' de la vista. Puede lograr el mismo efecto anterior al descartar la variable local '$ active_link' y acceder a ella en el script incluido usando' $ this-> active_link'. –