Separar la vista en archivos reutilizables como header.php, menu.php,
aside.php y footer.php mejora la organización, la
reutilización y el mantenimiento del proyecto.
/mi-sitio
/public
index.php
estilos.css
/views
/partials
header.php
menu.php
aside.php
footer.php
home.php
about.php
contact.php
/config
paths.php
| Ventaja | Descripción |
|---|---|
| Reutilización | El mismo encabezado/menú se usa en todas las páginas. |
| Mantenimiento | Un cambio en un partial se refleja en todo el sitio. |
| Orden | Código más limpio y archivos más cortos. |
| Escalabilidad | Facilita pasar a MVC/plantillas más adelante. |
El archivo principal arma la página incluyendo partials y el contenido central según la ruta.
<?php
declare(strict_types=1);
require __DIR__ . '/../config/paths.php'; // define rutas BASE, VIEW_PATH, PARTIALS_PATH
$page = $_GET['page'] ?? 'home';
$viewFile = VIEW_PATH . "/{$page}.php";
$title = ucfirst($page) . " | Mi Sitio"; // variable que usará el header
require PARTIALS_PATH . '/header.php';
require PARTIALS_PATH . '/menu.php';
echo "<main>";
if (is_file($viewFile)) {
require $viewFile;
} else {
http_response_code(404);
echo "<h2>404 — Página no encontrada</h2>";
}
echo "</main>";
require PARTIALS_PATH . '/aside.php';
require PARTIALS_PATH . '/footer.php';
?>
<?php
// $title puede venir definido desde index.php
$t = isset($title) ? htmlspecialchars($title, ENT_QUOTES, 'UTF-8') : 'Mi Sitio';
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= $t ?></title>
<link rel="stylesheet" href="/estilos.css">
</head>
<body>
<header>
<h1>Mi Sitio</h1>
</header>
<nav>
<ul>
<li><a href="/index.php?page=home">Inicio</a></li>
<li><a href="/index.php?page=about">About</a></li>
<li><a href="/index.php?page=contact">Contacto</a></li>
</ul>
</nav>
<aside>
<h3>Novedades</h3>
<ul>
<li>Curso PHP — nuevas fechas</li>
<li>Tips de seguridad web</li>
</ul>
</aside>
<footer> <p>© Pablo Cossio — Solo para uso educativo</p> </footer> </body> </html>
<section> <h2>Bienvenido</h2> <p>Este es el home del sitio.</p> </section>
| Función | Si falta el archivo | Uso típico |
|---|---|---|
include | Emite warning y continúa | Partials no críticos |
require | Error fatal y detiene | Archivos esenciales (config, autoload, header) |
include_once / require_once | Idem, pero asegura incluirlo una sola vez | Evitar redefinir funciones/clases |
require/require_once;
para piezas opcionales, include. Evitá incluir el mismo archivo más de una vez: preferí _once.
Definí rutas absolutas en un archivo de configuración para evitar problemas de “ruta relativa”.
<?php
// /config/paths.php
define('BASE_PATH', realpath(__DIR__ . '/..'));
define('VIEW_PATH', BASE_PATH . '/views');
define('PARTIALS_PATH', VIEW_PATH . '/partials');
?>
Los partials comparten el ámbito del script que los incluye. Podés “inyectar” variables antes del require.
<?php $title = "About | Mi Sitio"; $usuario = "Pablo"; require PARTIALS_PATH . '/header.php'; ?> <!-- dentro de header.php podrías usar $title y en menu.php, $usuario si lo necesitás -->
_once.__DIR__ y constantes de paths.<header>...</header> y <body>...</body> se abran/cierren en el orden correcto (generalmente header abre <html><head><body> y footer los cierra).page contra una whitelist para evitar incluir archivos arbitrarios.require_once para piezas críticas y mantené la lógica separada de la presentación.