Programación Avanzada – ¿Cómo funciona PS-4?

Arranquemos de cero.. ¿Qué es PSR-4?

PSR-4 es un estándar (definido por PHP-FIG) que nos permite cargar automáticamente clases PHP sin necesidad de usar require o include manualmente.

  • Autoloading: Cuando usas una clase (ej: new MiClase()), PHP la busca y carga automáticamente gracias a Composer.
  • Namespaces: Los namespaces (espacios de nombres) son como «rutas virtuales» que organizan tus clases.
  • Estructura de carpetas: Tus clases deben seguir una estructura de carpetas que coincida con sus namespaces.

¿Cómo configurar PSR-4 en Composer?

Vamos a empezar a realizar la estructura de proyecto para PHP

mi_proyecto/
├── src/
│   ├── MiApp/
│   │   ├── Cliente.php
│   │   ├── Producto.php
├── vendor/
├── composer.json

Definir namespaces en las clases

Ejemplo: src/MiApp/Cliente.php

<?php
namespace MiApp;  // Namespace = MiApp

class Cliente {
    public function __construct() {
        echo "Cliente creado!";
    }
}

Configurar PSR-4 en composer.json

Modificamos el archivo composer.json:

{
    "autoload": {
        "psr-4": {
            "MiApp\\": "src/MiApp/"
        }
    }
}

DATOS:

"MiApp\\": El namespace base.

"src/MiApp/": La carpeta donde están las clases

Regeneramos el autoloader

Desde la terminal ejecutamos el siguiente comando:

composer dump-autoload

Ahora…. ¿Cómo usamos las clases?

<?php
require __DIR__ . '/vendor/autoload.php';  // Cargamos el autoloader de Composer

use MiApp\Cliente;  // Importamos la clase Cliente

$cliente = new Cliente();  // Instanciamos la clase (el autoloading funciona, en teoría, si pasa algo es importante ir leyendo el log que nos genera el PHPServer como vimos en clase)

Reglas clave de PSR-4

  1. Namespace ≡ Ruta de archivo:
    • MiApp\Clientesrc/MiApp/Cliente.php
    • Vendor\Paquete\Foosrc/Vendor/Paquete/Foo.php
  2. El namespace debe terminar en \\ (ej: "MiApp\\").
  3. Las clases deben tener el mismo nombre que el archivo:
    • class ClienteCliente.php
  4. Sensible a mayúsculas/minúsculas (en Linux/macOS).

Ejemplo avanzado (múltiples namespaces, lo normal en un proyecto)

src/
├── MiApp/
│   ├── Cliente.php
├── OtroApp/
│   ├── Producto.php

Configuración en composer.json:

{
    "autoload": {
        "psr-4": {
            "MiApp\\": "src/MiApp/",
            "OtroApp\\": "src/OtroApp/"
        }
    }
}

Errores comunes que vamos a tener a la hora de comenzar a trabajar

Class not found:

  • Verifica que el namespace coincida con la ruta.
  • Revisa mayúsculas/minúsculas.
  • Ejecuta composer dump-autoload.

Namespace mal escrito:

  • Asegúrate de que termine en \\ (ej: "MiApp\\").

Resumen rápido para tener en cuenta:

  1. Namespace = Ruta virtual de la clase que vamos a importar.
  2. Estructura de carpetas debe coincidir con el namespace SIEMPRE.
  3. Configura composer.json con psr-4.
  4. Ejecuta: «composer dump-autoload" sin las comillas para actualizar.

Deja un comentario

I’m Luis E. Fagúndez

Bienvenidos a mi página web personal. Mi nombre es Luis, me gusta enseñar, programar y tomar litros y litros de café.

En esta web vas a encontrar materiales sobre educación, programación, Gnu/Linux, software libre y mucho más.

Esta web busca brindar información sobre las asignaturas que imparto en DGETP-UTU, así como proyectos personales y otras cosas.

Gracias por ser parte de esta hermosa comunidad.

Formas de contacto