2009-04-17 13 views
16

Si tengo un archivo hola.php así:¿Puedes renderizar un archivo PHP en una variable?

Hello, <?php echo $foo; ?>! 

me gustaría hacer algo como esto en algún código PHP:

$text = renderPhpToString('hello.php', array('foo'=>'World')); 

y terminar con

$text == 'Hello, World!' 

¿Es esto posible con PHP 5 estándar? Obviamente quiero plantillas más complejas con bucles y así sucesivamente ..

Respuesta

36

Usted podría tomar alguna función como esta:

function renderPhpToString($file, $vars=null) 
{ 
    if (is_array($vars) && !empty($vars)) { 
     extract($vars); 
    } 
    ob_start(); 
    include $file; 
    return ob_get_clean(); 
} 

Se utiliza la función de control del buffer de salida ob_start() para amortiguar la siguiente salida hasta que sea devuelto por ob_get_clean().

Editar Asegúrese de que validar los datos pasados ​​a esta función de manera que $vars no tiene un elemento file que anular el valor pasado $file argumento.

+3

mejor esperanza de que alguien no envía $ vars = array ('file' => 'http://example.com/hax.php') –

+0

Esto es exactamente lo que estoy buscando. No hay necesidad de preocuparse por la entrada del usuario en mi caso. ¡Gracias! – danb

+1

>> No hay necesidad de preocuparse por la entrada del usuario en mi caso. No solo le preocupa la entrada del usuario aquí; un futuro desarrollador podría llamar a la función con $ vars = array ('file' => 'http://example.com/whoops.php'), y luego pasar un buen tiempo desubicando esto. –

1

Puede hacerlo con output buffering, pero podría ser mejor utilizar uno de los muchos motores de plantillas.

2

Como Gumbo dijo que debes verificar la variable $ file, es un error sutil que ya me ha picado. Usaría func_get_arg (i) y no tendría ninguna variable, y algo menor, usaría require.

function renderPhpToString() 
{ 
    if(is_array(func_get_arg(1))) { 
     extract(func_get_arg(1)); 
    } 
    ob_start(); 
    require func_get_arg(0); 
    return ob_get_clean(); 

} 
+0

¿Por qué no simplemente hacer '$ vars = []'? –

2

respecto pasando $vars = array('file' => '/etc/passwd');, podría utilizar extract($vars, EXTR_SKIP);

+0

En mi humilde opinión, si cree que podría necesitar 'EXTR_SKIP', debería considerar si existe o no una solución mejor. –

Cuestiones relacionadas