Estructura tu código con espacios de nombres PSR-4 y deja que Composer cargue las clases y las dependencias por ti.
Abrir esta lección en KodokonLos 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
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,
) {
}
}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
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';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.
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -oApp\Blog\PostRepository si el prefijo App\ apunta a src/?composer require --dev?