2012-04-13 8 views
8

Duplicar posible:
Execute a PHP file, and return the result as a string
PHP capture print/require output in variable¿Cómo conseguir incluir contenidos como una cadena?

Estoy tratando de obtener el contenido de un incluyen en una cadena. ¿Es eso posible?

Por ejemplo, si tengo un archivo test.php:

<?php 
echo 'a is equal to '.$a; 
?> 

necesito una función, digamos include_to_string para incluir el prueba.php y devolver lo que sería la producción en en en una cadena.

Algo así como:

<?php 
$a = 4; 
$string = include_to_string(test.php); // $string = "a is equal to 4" 
?> 
+0

@safarov mi conjetura es que no va a evaluar su variable de –

+0

creo que no va a sustituir un $ en el archivo test.php. dejame revisar. – ppp

Respuesta

28
<?php 

    ob_start(); 
    include 'test.php'; 
    $string = ob_get_clean(); 

Creo que es lo que desea. Ver output buffering.

+1

Esa técnica se llama buffer de salida para cualquier persona curiosa. –

+0

@ Xeon06 ¡Acaba de agregar un enlace manual mientras escribía el comentario! Saludos por el prod aunque :-) – DaveRandom

+0

@nickb [No, no lo hace] (http://php.net/manual/en/function.ob-get-clean.php), 'ob_end_clean()' devuelve 'bool '. 'ob_get_clean()' es un atajo para llamar a '$ str = ob_get_contents(); ob_end_clean(); ' – DaveRandom

5
ob_start(); 
include($file); 
$contents = ob_get_contents(); // data is now in here 
ob_end_clean(); 
3

Usted puede hacer esto con output buffering:

function include2string($file) { 
    ob_start(); 
    include($file); 
    return ob_get_clean(); 
} 

@DaveRandom señala (correctamente) que el problema con esta envolviendo en una función es que el script (archivo $) no tendrá acceso a variable definida globalmente Puede que esto no sea un problema para muchos scripts incluidos dinámicamente, pero si es un problema para usted, entonces esta técnica se puede utilizar (como otros han demostrado) fuera de un contenedor de funciones.

** Importación de variables Una cosa que puede hacer es agregar un conjunto de datos que le gustaría exponer a su secuencia de comandos como variables. Piense en ello como pasar datos a una plantilla.

function include2string($file, array $vars = array()) { 
    extract($vars); 
    ob_start(); 
    include($file); 
    return ob_get_clean(); 
} 

Se podría llamar de esta manera:

include2string('foo.php', array('key' => 'value', 'varibleName' => $variableName)); 

y ahora $key y $variableName sería visible dentro de su archivo foo.php.

También podría proporcionar una lista de variables globales para "importar" para su secuencia de comandos si eso le parece más claro.

function include2string($file, array $import = array()) { 
    extract(array_intersect_key($GLOBALS, array_fill_keys($import, 1))); 
    ob_start(); 
    include($file); 
    return ob_get_clean(); 
} 

Y ustedes lo llaman, que proporciona una lista de las variables globales que le gustaría expuestos a la secuencia de comandos:

$foo='bar'; 
$boo='far'; 
include2string('foo.php', array('foo')); 

foo.php debería ser capaz de ver foo, pero no boo.

+0

Problema al envolverlo en una función es el alcance variable ... – DaveRandom

+0

@DaveRandom, buena llamada. – Prestaul

+0

esto es lo que estaba haciendo mal. Encontré este método en otra respuesta, pero obtuve un error variable no declarado ya que las variables se declararon fuera del alcance de la función. – ppp

0

También podría usar esto a continuación, pero recomiendo la respuesta anterior.

// How 1th 
$File = 'filepath'; 
$Content = file_get_contents($File); 

echo $Content; 

// How 2th 
function FileGetContents($File){ 
    if(!file_exists($File)){ 
     return null; 
    } 

    $Content = file_get_contents($File); 
    return $Content; 
} 

$FileContent = FileGetContents('filepath'); 
echo $FileContent; 

función en el manual de PHP: file_get_contents

+0

Esto obtiene los contenidos pero no ejecutará el PHP en el include y devolverá el código PHP sin procesar. – MrCode

+0

Cierto, no vi la palabra clave ejecutar en la publicación OP ... Pude haber entendido mal la pregunta. –

+0

@MrCode Supongo que podría 'eval()' (mal) hacerlo, pero aún sufre el problema de alcance variable que obtiene al hacerlo en una función y es probablemente más costoso que simplemente 'include()' ing en el primer lugar – DaveRandom

Cuestiones relacionadas