2010-01-13 22 views
6

En lugar de usar un include, que ejecuta el php incluido en el archivo ... ¿es posible guardar el contenido de un archivo php en una variable, pero con el php intacto y ejecutable?PHP file_get_contents con php intacto?

Mi objetivo se ve algo como:

$template = some_imaginary_include_function('myfile.php'); 
foreach($list_of_blogs as $blog) { 
    // somehow get blog content in template and render template; 
} 

se que esto es un ejemplo tonto ... pero espero que ilustra la idea general. Si tengo que recorrer la plantilla 50 veces en una página (digamos que es una lista de blogs), parece tonto ejecutarla e incluirla para cada uno.

¿Estoy equivocado? ¿Hay alguna forma de hacer esto?

+0

Parece una optimización prematura. Use un caché de código de operación si le preocupa leer y compilar el archivo varias veces. –

+0

@BenJames ¿PHP no optimiza de forma nativa las inclusiones repetidas? IIRC alguien mencionó esto en una discusión sobre el mismo asunto; se fuente si se encuentra. – Dan

Respuesta

16

¿Qué tal esto ...

function getTemplate($file) { 

    ob_start(); // start output buffer 

    include $file; 
    $template = ob_get_contents(); // get contents of buffer 
    ob_end_clean(); 
    return $template; 

} 

Básicamente, esto va a conseguir lo que es $file y analizarlo con PHP, a continuación, devolver la salida en una variable.

+0

así que eso es genial ... ¿pero la plantilla $ conservará las cosas PHP en el archivo?o se convertirá en texto sin formato? – johnnietheblack

+1

se ejecutará – OcuS

+0

Como dijo OcuS, se analizará y se ejecutará: p. se convertirá en/yoursite/etc – alex

0

Escriba una función en el script PHP incluido que devuelve el resultado deseado. Defina una constante en el script PHP principal. En el script PHP incluido, verifique la ausencia de dicha constante y repita el valor de retorno de la función si este es el caso.

0

A pesar de que a menudo se pretende que sea el mal, se podría tratar de usar eval() junto con get_file_contents()

+0

Utilizo 'eval()' en el CMS básico de mi sitio web. Woops. –

0

Si está desarrollando en 5.3 es mucho más fácil, pero incluso en 5.2 se puede utilizar lo que se llama una función anónima que hacer esta.

Una función anónima le permitirá pasar el código como una variable. Para cargar este código desde un archivo, puede que tenga que file_get_bytes en una cadena, evalúe eso y luego ingrese una variable, pero obtendrá el punto que espero.

5,3: Anonymous functions

5,2: create_function

1

Hacer la incluyen en el bucle no es SO mudo.

Todas las variables definidas antes de la inclusión serán accesibles en su plantilla.

¡Mantenlo simple!

== == EDITAR

O tal vez se podría mejorar la respuesta de Alex:

function getTemplate($file, $template_params = array()) { 

    ob_start(); // start output buffer 
    extract($template_params); // see PHPDoc 
    // from here $var1 will be accessible with value "value1" 
    // so your template may contain references to $var1 

    include $file; 
    $template = ob_get_contents(); // get contents of buffer 
    ob_end_clean(); 
    return $template; 

} 
echo getTemplate('your_template.php', array('var1' => 'value1')); 

(No es tan simple ya ^^)

+0

haha, K.I.S.S. - Que sea simple estúpido. el mejor consejo que tengo. lastima mis sentimientos todo el tiempo buena llamada, gracias :) – johnnietheblack

+0

pregunta, aunque ... literalmente espero que algunas páginas tengan 50-100 listados para repetir ... ¿crees que comenzará a afectar el rendimiento si incluyo todo el tiempo? – johnnietheblack

+0

Estoy seguro de que es rápido y supongo que php-engine tiene un sistema de almacenamiento en caché, por lo que la plantilla no se analiza completamente cada vez (no estoy seguro de eso, gran conjetura :)) – OcuS

4

Mediante el uso de $content = file_get_contents('/path/to/your/file.php'); todas las etiquetas PHP será preservado, puede eval() o tokenize hacer lo que desee.

+2

+1 A pesar de las implicaciones de seguridad y rendimiento que los nay-sayers pueden sacar de sus funciones, creo que esta es la respuesta correcta según la pregunta. – Dan

+0

eval ... tos ... mal ... perdón por eso. – Mayhem

Cuestiones relacionadas