Menu
Coddy logo textTech

Estándar de carga automática PSR-4

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 12 de 91.

PSR-4 es un estándar que define cómo deben cargarse automáticamente las clases de PHP según su espacio de nombres y la ubicación de sus archivos. En lugar de incluir manualmente cada archivo de clase, PSR-4 permite que PHP encuentre y cargue las clases automáticamente cuando las usas.

La regla principal es sencilla: el espacio de nombres debe coincidir con la estructura de directorios. Si tienes una clase App\Models\User, el archivo debe estar ubicado en App/Models/User.php.

<?php
// Archivo: src/Models/User.php
namespace App\Models;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

Puedes escribir una función de autoloading sencilla que siga las reglas de PSR-4:

<?php
// Archivo: autoload.php
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';
    
    // Comprueba si la clase usa nuestro prefijo de namespace
    if (strpos($class, $prefix) === 0) {
        $relativeClass = substr($class, strlen($prefix));
        $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
        
        if (file_exists($file)) {
            require $file;
        }
    }
});

La función spl_autoload_register indica a PHP que llame a tu función cada vez que encuentre una clase desconocida. La función convierte el espacio de nombres en una ruta de archivo y la carga.

Punto clave: PSR-4 crea una correspondencia predecible entre los espacios de nombres y las rutas de archivo. Cuando ves App\Models\User, sabes de inmediato que el archivo está en src/Models/User.php. Esta convención facilita la navegación y el mantenimiento de los proyectos.

challenge icon

Desafío

Fácil

Construyamos un sistema sencillo de carga automática PSR-4 que cargue automáticamente las clases según su espacio de nombres y la ubicación de sus archivos.

Crearás un proyecto con tres archivos que demuestran cómo PSR-4 asigna los espacios de nombres a las rutas de directorios:

  • src/Services/Logger.php: Define una clase Logger en el espacio de nombres App\Services. Debe tener una propiedad public $name, un constructor que acepte y establezca el nombre, y un método log($message) que devuelva "[name] logged: [message]".
  • src/Services/Mailer.php: Define una clase Mailer en el espacio de nombres App\Services. Debe tener una propiedad public $sender, un constructor que acepte y establezca el remitente, y un método send($to) que devuelva "Mail from [sender] to [to]".
  • main.php: Crea un cargador automático PSR-4 usando spl_autoload_register que asigne el prefijo del espacio de nombres App\ al directorio src/. El cargador automático debe convertir los separadores de espacios de nombres en separadores de directorios y añadir .php para encontrar el archivo correcto. Después de registrar el cargador automático, usa la palabra clave use para importar ambas clases y, después, crea un Logger con el nombre "FileLogger" y un Mailer con el remitente "admin@site.com". Imprime el resultado de llamar a log("System started") en el registrador y a send("user@example.com") en el mailer (cada uno en su propia línea).

La idea clave es que tu función de carga automática recibe el nombre de clase completamente cualificado (como App\Services\Logger) y debe convertirlo en una ruta de archivo (src/Services/Logger.php). Usa strpos para comprobar si la clase comienza con el prefijo de tu espacio de nombres, substr para obtener el nombre de clase relativo y str_replace para convertir las barras invertidas en barras diagonales.

Pruébalo tú mismo

<?php
// Implementación de Autoloader PSR-4

// TODO: Registra un autoloader usando spl_autoload_register
// El autoloader debería:
// 1. Comprobar si la clase comienza con el prefijo de namespace 'App\'
// 2. Eliminar el prefijo 'App\' para obtener el nombre de clase relativo
// 3. Convertir los separadores de namespace (\) a separadores de directorio (/)
// 4. Anteponer 'src/' y añadir '.php' para construir la ruta del archivo
// 5. Requerir el archivo si existe

spl_autoload_register(function ($class) {
    // TODO: Define el prefijo de namespace y el directorio base
    
    // TODO: Comprueba si la clase usa el prefijo de namespace (usa strpos)
    
    // TODO: Obtén el nombre de clase relativo (usa substr)
    
    // TODO: Construye la ruta del archivo reemplazando \ con / (usa str_replace)
    
    // TODO: Requiere el archivo si existe
});

// TODO: Usa la palabra clave 'use' para importar las clases Logger y Mailer

// TODO: Crea una instancia de Logger con el nombre "FileLogger"

// TODO: Crea una instancia de Mailer con el remitente "admin@site.com"

// TODO: Imprime el resultado de log("System started")

// TODO: Imprime el resultado de send("user@example.com")
?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de PHP online