Apuntes php

PHP: Porque a veces necesitas un poco de caos en tu vida.

Incluyendo archivos en PHP

Reutilizar código fue una de las primeras ventajas de PHP que le permitió ganar en popularidad.
include y require son una de las herramientas más poderosas en PHP, ya que te permiten insertar y evaluar archivos externos, como scripts PHP, HTML, o plantillas. Un uso típico es incluir cabeceras y pies de página en un sistema de plantillas, pero las posibilidades son infinitas.

Include

La sentencia include inserta y evalúa un archivo especificado. Puedes incluir archivos locales o, en algunos casos, remotos (aunque esto es desaconsejado por seguridad). Ejemplo:

<?php
include 'header.php';
?>

Esto inserta el contenido de header.php en el punto donde se llama. Si el archivo contiene código PHP, debe estar dentro de etiquetas <?php ?>, ya que PHP pasa a modo HTML fuera de estas etiquetas.

Ejemplo de archivo incluido (header.php):

<?php
declare(strict_types=1);
$titulo = "Mi Sitio Web";
?>
<header>
    <h1><?php echo htmlspecialchars($titulo); ?></h1>
</header>

Notas: Por seguridad usa (string) para forzar tipos en variables incluidas:

<?php
$titulo = 123; // De una fuente externa
echo (string)$titulo;
?>
  • Si el archivo no existe, include emite una advertencia (E_WARNING) y continúa la ejecución.
  • Puedes incluir archivos remotos (por ejemplo, include 'http://example.com/script.php';), pero evítalo por riesgos de seguridad (inyección de código remoto). Configura allow_url_include = Off en php.ini para mayor seguridad.

Require

require es similar a include, pero si el archivo no existe, produce un error fatal (E_COMPILE_ERROR) y detiene la ejecución:

<?php
require 'config.php';
?>

Ejemplo de archivo incluido (config.php):

<?php
declare(strict_types=1);
const DB_HOST = 'localhost';
?>

Diferencia clave: - include continúa si el archivo falta (advertencia) mientras require detiene el script si el archivo falta (error fatal).

Ambas sentencias pueden usarse condicionalmente:

<?php
if (true) {
    include 'header.php'; // O require
}
?>

Include_once y Require_once

include_once y require_once garantizan que un archivo se incluya solo una vez, evitando redefiniciones de funciones, clases, o variables:

<?php
const ARCHIVO_CONFIG = 'config.php';
include_once ARCHIVO_CONFIG;
require_once ARCHIVO_CONFIG;
?>

Nota: Usa constantes para nombres de archivos, mejorando la mantenibilidad:

<?php
const HEADER = 'header.php';
include_once HEADER;
?>

Ejemplo práctico:

<?php
// archivo funciones.php
function saludar(): string {
    return "Hola, mundo!";
}

// archivo principal
include_once 'funciones.php';
include_once 'funciones.php'; // Ignorado
echo saludar(); // Imprime: Hola, mundo!
?>

Alcance de variables y paths

El código incluido hereda el alcance de variables del archivo que lo llama. Por ejemplo:

<?php
$color = "azul";
include 'colores.php';
?>

colores.php:

<?php
echo "El color es $color\n"; // Imprime: El color es azul
?>

Para los paths, el directorio de trabajo es el del script principal, no el del archivo incluido:

<?php
// index.php
include 'anexos/footer.php';
?>

footer.php:

<?php
// Correcto: usa el path relativo al script principal
include 'anexos/notes.php';
?>

Usa __DIR__ para paths robustos:

<?php
include __DIR__ . '/anexos/footer.php';
?>

Valor de retorno

include y require devuelven 1 si el archivo se incluye con éxito, o el valor de return si el archivo lo especifica:

<?php
// config.php
return ['host' => 'localhost'];

// index.php
$config = include 'config.php';
print_r($config); // Imprime: Array ( [host] => localhost )
?>

Seguridad y buenas prácticas

  • Verifica existencia: Usa file_exists() antes de incluir:
<?php
if (file_exists('header.php')) {
    include 'header.php';
} else {
    echo "Archivo no encontrado\n";
}
?>
  • Evita archivos remotos: Desactiva allow_url_include en php.ini.
  • Usa rutas absolutas: __DIR__ o constantes para evitar errores en paths.
  • Protege variables: Sanitiza datos incluidos con htmlspecialchars() o casting.
  • Evita inclusiones dinámicas inseguras:
<?php
// Inseguro: permite inyección
include $_GET['archivo'];

// Seguro: valida opciones
$archivo = $_GET['archivo'] ?? '';
if (in_array($archivo, ['header.php', 'footer.php'])) {
    include $archivo;
}
?>

Ejemplo completo: Sistema de plantillas

index.php:

<?php
declare(strict_types=1);
$titulo = "Bienvenidos";
$contenido = "Este es el contenido principal.";
?>

<!DOCTYPE html>
<html>
<head>
    <title><?php echo htmlspecialchars($titulo); ?></title>
</head>
<body>
    <?php include 'header.php'; ?>
    <main>
        <?php echo htmlspecialchars($contenido); ?>
    </main>
    <?php include 'footer.php'; ?>
</body>
</html>

header.php:

<?php
declare(strict_types=1);
?>
<header>
    <h1><?php echo htmlspecialchars($titulo); ?></h1>
    <nav>
        <a href="/">Inicio</a> | <a href="/about">Acerca</a>
    </nav>
</header>

footer.php:

<?php
declare(strict_types=1);
include __DIR__ . '/notes.php';
?>
<footer>
    <p>&copy; 2025 Mi Sitio Web</p>
</footer>

notes.php:

<?php
declare(strict_types=1);
echo "<p>Nota: Este sitio usa plantillas.</p>\n";
?>

Salida:

<!DOCTYPE html>
<html>
<head>
    <title>Bienvenidos</title>
</head>
<body>
    <header>
        <h1>Bienvenidos</h1>
        <nav>
            <a href="/">Inicio</a> | <a href="/about">Acerca</a>
        </nav>
    </header>
    <main>
        Este es el contenido principal.
    </main>
    <p>Nota: Este sitio usa plantillas.</p>
    <footer>
        <p>&copy; 2025 Mi Sitio Web</p>
    </footer>
</body>
</html>
TOP