Modularización de código en PHP con archivos

Resumen

Modularizar código en PHP significa dividir tu aplicación en varios archivos para que sea más legible, mantenible y escalable. Si trabajas en proyectos grandes, esta práctica te permite separar lógica, clases y vistas usando funciones como include, include_once y require, que actúan como puentes entre archivos.

Y aquí viene lo interesante: estas tres funciones parecen iguales, pero tienen diferencias sutiles que pueden romperte el código si no las entiendes bien.

¿Por qué deberías modularizar tu código en PHP?

En aplicaciones reales, meter todo en un solo archivo es una receta para el caos. Dividir el código te da orden, claridad y la posibilidad de definir estándares de carpetas para tus proyectos [1:00].

Cuando separas archivos por responsabilidad, encontrar qué editar deja de ser una búsqueda dentro de cientos de líneas: te vas directo al archivo que necesitas. Esa es la diferencia entre un proyecto que escala y uno que se vuelve impagable de mantener.

¿Qué significa modularizar el código? Es dividir tu aplicación en archivos separados según su función (clases, lógica, vistas) para que cada pieza sea independiente y reutilizable.

¿Cuál es la diferencia entre include, require e include_once?

Las tres funciones importan un archivo dentro de otro, como si copiaras y pegaras su contenido. Pero se comportan distinto cuando algo sale mal [2:30].

  • include: si no encuentra el archivo, lanza un warning y el programa sigue ejecutándose.
  • include_once: igual que include, pero si ya importaste ese archivo antes, lo ignora la segunda vez.
  • require: si no encuentra el archivo, lanza un fatal error y detiene la ejecución por completo.

Esa diferencia es clave: usa require cuando el archivo es indispensable, y include cuando puedes vivir sin él.

¿Qué pasa si importas el mismo archivo dos veces con include?

Si tu archivo importado define constantes o clases, vas a obtener un error de redeclaración. PHP te dirá que la constante o clase ya existe, porque include literalmente vuelve a pegar el código [9:40].

Para evitarlo, tienes dos caminos: usar include_once o ser disciplinado con require y controlar manualmente desde dónde importas cada archivo.

¿Cuándo debo usar require en vez de include? Usa require cuando el archivo contiene código crítico (clases, configuración, conexiones). Si falta, prefieres que el programa se detenga antes de seguir con datos rotos.

¿Cómo estructurar un proyecto PHP modularizado?

Una estructura básica que funciona muy bien separa el código en tres responsabilidades: clases, lógica y vista. El ejemplo práctico de la clase usa una carpeta classes para definiciones, otra logic para instanciar objetos, y un index.php como vista [12:00].

Dentro de classes/Michi.php se define una clase con propiedades protected (name, color, age), un constructor y métodos getter generados rápidamente con la extensión PHP Getters and Setters de Visual Studio Code [14:30].

Luego, en logic/CreateMichis.php, se hace require de la clase y se crean las instancias:

php require 'classes/Michi.php';

$mrMichi = new Michi('Mr. Michi', 'blanco', 16); $michiSanzio = new Michi('Michi Sanzio', 'naranja', 14); $michales = new Michi('Michales', 'negro', 15);

Finalmente, el index.php solo necesita una línea para traer toda la lógica:

php

<?php require 'logic/CreateMichis.php'; ?> <ul> <li><?= $mrMichi->getName() ?> dice <?= $mrMichi->sayMeow() ?></li> </ul>

¿Por qué no uso ../ al hacer require dentro de logic?

Porque el archivo CreateMichis.php se está requiriendo desde index.php, que vive en la raíz. Para PHP, las rutas relativas se resuelven desde el archivo que inicia la ejecución, no desde el archivo que contiene el require [19:50].

Por eso dentro de logic/CreateMichis.php la ruta sigue siendo classes/Michi.php y no ../classes/Michi.php. Es un detalle que confunde a muchos al principio.

¿Qué errores comunes evitar al modularizar?

El error más típico es importar la misma clase desde dos lugares distintos. Si index.php hace require de la clase Michi, y CreateMichis.php también, PHP lanzará: Cannot redeclare class Michi [21:10].

La regla de oro: una clase se incluye una sola vez en toda la cadena de archivos. Si necesitas garantías, usa require_once (variante de require con la lógica de include_once) en archivos que se reutilizan en muchos lugares.

  • Verifica siempre desde dónde se ejecuta el archivo principal.
  • Mantén las rutas relativas al entry point, no al archivo intermedio.
  • Documenta qué archivo es responsable de importar cada clase.

Con esta separación, tu vista queda limpia (solo HTML y variables), tu lógica vive en su carpeta, y tus clases son piezas reutilizables. Justo así empiezan a verse los proyectos profesionales en PHP.

¿Tú cómo organizas tus carpetas en PHP? Cuéntame en los comentarios qué estructura usas en tus proyectos.