Autonomía digital y tecnológica

Código e ideas para una internet distribuida

Cómo incluir un archivo en una variable: funciones de control de salida y bufers en PHP

Imago voragine.net

Frecuentemente se usan en PHP las funciones include o require para incluir un archivo en otro. Esto se suele usar para fragmentos de código necesarios en múltiples lugares, para evitar así la repetición; también para estructurar el código y facilitar su edición.

Ninguna de estas soluciones es válida si se quiere incluir el contenido de un archivo en una variable. Fundamentalmente porque esos archivos pueden contener código PHP que al ejecutarse produce una salida, en forma de código HTML, que es lo se quiere capturar con la variable. Es decir, en la variable no queremos el código «fuente», sino el código ya «procesado» por PHP.

Por lo tanto es necesario incluir el código PHP y ejecutarlo, pero en vez de «imprimir» la salida, capturarla en una variable. Eso es exactamente lo que hace la familia de funciones de control de salida. Son necesarias tres funciones: ob_start, que abre un bufer para almacenar la salida; ob_end_clean, que limpia y cierra el bufer; y ob_get_contents, que procesa (ejecuta el PHP) el contenido almacenado en el bufer, sin borrarlo de manera que podemos ejecutarlo más de una vez.

Por ejemplo, si se quiere construir una página web a partir de los siguientes tres archivos, begin.php, main.php y end.php, que juntaremos en un cuarto, index.php.

La cabecera, en begin.php:

<!DOCTYPE html>
<html lang="<?php funcion_de_lenguaje(); ?>">
<head>
<meta charset="<?php funcion_de_lenguaje(); ?>" />
<title><?php funcion_de_titulo(); ?></title>
<meta content="<?php funcion_de_descripcion(); ?>" name="description" />
</head>
<body>

El contenido, en main.php:

<?php funcion_para_generar_contenido(); ?>

El cierre de la página, en end.php:

<?php funcion_de_estadisticas(); ?>
</body>
</html>

E index.php, donde juntaremos todo:

<?php
ob_start(); # apertura de bufer
include( 'begin.php' );
$begin = ob_get_contents();
ob_end_clean(); # cierre de bufer

ob_start(); # apertura de bufer
include( 'end.php' );
$end = ob_get_contents();
ob_end_clean(); # cierre de bufer

ob_start(); # apertura de bufer
include( 'main.php' );
$main = ob_get_contents();
ob_end_clean(); # cierre de bufer

echo $begin.$main.$end;
?>

1 comentario

    • Por Rick •

    Muchas Gracias, hacia mucho que buscaba esto, era realmente frustrante no poder avanzar con mi proyecto sin tener que repetir codigo de una forma mediocre; pero gracias a vuestra ayuda ahora se que lo imposible algún día sera tan posible como así lo creamos. Muchas Gracias :)

Dejar un comentario

*
*

 

No hay trackbacks