Kodokon kodokon.com

Espacios de nombres, autocarga y Composer

Estructura tu código con espacios de nombres PSR-4 y deja que Composer cargue las clases y las dependencias por ti.

8 min · 3 preguntas

Abrir esta lección en Kodokon

Los espacios de nombres eliminan las colisiones de nombres: dos bibliotecas pueden definir cada una una clase Client sin conflicto. La convención universal: un prefijo de proveedor (App, Acme\Blog), y luego subespacios de nombres que reflejan el árbol de carpetas. use importa un nombre completamente cualificado en el archivo actual, as lo renombra en caso de ambigüedad. Un archivo = una clase = un espacio de nombres: esta disciplina no es una manía estilística, es la condición misma de la autocarga.

PHP
<?php

declare(strict_types=1);

namespace App\Service;

use App\Repository\UserRepository;
use Psr\Log\LoggerInterface as Logger;

final class UserService
{
    public function __construct(
        private UserRepository $users,
        private Logger $logger,
    ) {
    }
}
Un archivo src/Service/UserService.php: espacio de nombres, importaciones, alias.

La autocarga carga los archivos de clase bajo demanda: se acabaron los require manuales. El estándar PSR-4 define la correspondencia: un prefijo de espacio de nombres se asocia a una carpeta raíz, y cada subespacio de nombres se convierte en una subcarpeta. Así, App\Service\UserService se resuelve en src/Service/UserService.php. Por debajo, todo se apoya en spl_autoload_register - aquí está la implementación mínima, que vale la pena entender aunque nunca la reescribas:

PHP
<?php

declare(strict_types=1);

spl_autoload_register(function (string $class): void {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';

    if (!str_starts_with($class, $prefix)) {
        return;
    }

    $relative = substr($class, strlen($prefix));
    $path = $baseDir
        . str_replace('\\', '/', $relative)
        . '.php';

    if (is_file($path)) {
        require $path;
    }
});

echo 'Autoloader registered';
Autocargador PSR-4 hecho a mano: prefijo, carpeta raíz, conversión a una ruta.

Composer industrializa todo esto: composer.json declara tus dependencias y tu correspondencia PSR-4 - normalmente "autoload": { "psr-4": { "App\\\\": "src/" } } - luego composer install descarga los paquetes en vendor/ y genera vendor/autoload.php, el único require de toda tu aplicación. Distinción esencial: require para los paquetes necesarios en producción, require-dev para las herramientas (pruebas, análisis estático), excluidas de los despliegues con --no-dev.

BASH
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -o
Ciclo de vida: inicializar, añadir dependencias, regenerar el autocargador.

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. Según PSR-4, ¿dónde se ubica la clase App\Blog\PostRepository si el prefijo App\ apunta a src/?
    • src/App/Blog/PostRepository.php
    • src/Blog/PostRepository.php
    • src/blog/postrepository.php
  2. ¿Qué archivo debes incluir para beneficiarte de la autocarga generada por Composer?
    • composer.json
    • vendor/autoload.php
    • un autoload.php que hay que crear en la raíz
  3. ¿Para qué sirve composer require --dev?
    • Instalar un paquete solo de desarrollo, excluido de los despliegues con --no-dev
    • Instalar una versión inestable del paquete
    • Instalar el paquete globalmente en la máquina