Estructura modular de páginas en PHP

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.

Índice

Estructura de carpetas sugerida

/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

¿Por qué es buena práctica?

VentajaDescripción
ReutilizaciónEl mismo encabezado/menú se usa en todas las páginas.
MantenimientoUn cambio en un partial se refleja en todo el sitio.
OrdenCódigo más limpio y archivos más cortos.
EscalabilidadFacilita pasar a MVC/plantillas más adelante.

index.php (maquetador principal)

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';
?>

Ejemplos de partials

views/partials/header.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>

views/partials/menu.php

<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>

views/partials/aside.php

<aside>
  <h3>Novedades</h3>
  <ul>
    <li>Curso PHP — nuevas fechas</li>
    <li>Tips de seguridad web</li>
  </ul>
</aside>

views/partials/footer.php

<footer>
  <p>© Pablo Cossio — Solo para uso educativo</p>
</footer>
</body>
</html>

views/home.php

<section>
  <h2>Bienvenido</h2>
  <p>Este es el home del sitio.</p>
</section>

include vs require (y _once)

FunciónSi falta el archivoUso típico
includeEmite warning y continúaPartials no críticos
requireError fatal y detieneArchivos esenciales (config, autoload, header)
include_once / require_onceIdem, pero asegura incluirlo una sola vezEvitar redefinir funciones/clases
Recomendación: para layout y config usá require/require_once; para piezas opcionales, include. Evitá incluir el mismo archivo más de una vez: preferí _once.

Rutas seguras (constantes y __DIR__)

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');
?>

Pasar variables a los 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 -->

Errores comunes y consejos

Resumen: Dividir la vista en partials (header, menú, aside, footer) mejora la calidad del proyecto. Usá rutas absolutas, require_once para piezas críticas y mantené la lógica separada de la presentación.