Autoloader de Composer
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 13 de 91.
Escribir tu propio autoloader funciona, pero los proyectos de PHP reales utilizan Composer para gestionar el autoloading de forma automática. Composer lee la configuración de tu proyecto y genera un autoloader optimizado que sigue los estándares PSR-4.
La configuración reside en un archivo composer.json en la raíz de tu proyecto. Así es como defines las reglas de autoloading:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}Esto le indica a Composer que cualquier clase que comience con App\ debe cargarse desde el directorio src/. Después de configurar esto, Composer genera los archivos del cargador automático (autoloader) en un directorio vendor/.
Para usar el autoloader de Composer, solo necesitas una línea al principio de tu archivo de entrada:
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
Esa única sentencia require maneja toda la carga de clases para todo tu proyecto. Puedes definir múltiples mapeos de espacios de nombres si es necesario:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}Punto clave: El autoloader de Composer elimina las inclusiones manuales de archivos y garantiza una carga de clases consistente en todo tu proyecto. Es el enfoque estándar utilizado por prácticamente todas las aplicaciones y frameworks modernos de PHP.
Desafío
FácilVamos a construir una pequeña aplicación que utiliza el enfoque de carga automática (autoloading) de Composer para organizar clases en múltiples archivos. Simularás cómo un proyecto PHP real estructura su código con espacios de nombres PSR-4 y un cargador automático central.
Crearás cuatro archivos que trabajarán juntos:
src/Models/Product.php— Define una claseProducten el espacio de nombresApp\Models. Debe tener las propiedadespublic $nameypublic $price, un constructor que acepte y asigne ambos valores, y un métodogetInfo()que devuelva"[name]: $[price]".src/Models/Customer.php— Define una claseCustomeren el espacio de nombresApp\Models. Debe tener una propiedadpublic $name, un constructor que acepte y asigne el nombre, y un métodogreet()que devuelva"Welcome, [name]!".vendor/autoload.php— Crea un cargador automático simple usandospl_autoload_registerque imite el comportamiento de Composer. Debe mapear el prefijo de espacio de nombresApp\al directoriosrc/, convirtiendo los separadores de espacio de nombres en separadores de directorio y añadiendo.phppara cargar el archivo correcto.index.php— Este es tu archivo de punto de entrada. Requiere el cargador automático devendor/autoload.phpcon una sola línea, luego usa la palabra claveusepara importar tantoApp\Models\ProductcomoApp\Models\Customer. Crea unProductcon el nombre"Laptop"y el precio999, y unCustomercon el nombre"Alice". Imprime el resultado de llamar agreet()en el cliente ygetInfo()en el producto (cada uno en su propia línea).
El concepto clave aquí es que tu index.php solo necesita una sentencia require para cargar el cargador automático; después de eso, todas las clases se cargan automáticamente cuando las usas. Así es exactamente como funcionan los frameworks y aplicaciones PHP modernos con Composer.
Hoja de referencia
Composer automatiza la carga de clases leyendo un archivo de configuración composer.json y generando un autoloader optimizado que sigue los estándares PSR-4.
Define las reglas de carga automática en composer.json:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}Esto mapea el espacio de nombres App\ al directorio src/. Composer genera archivos de autoloader en un directorio vendor/.
Utiliza el autoloader de Composer con una única sentencia require:
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
Define múltiples mapeos de espacios de nombres si es necesario:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}El autoloader de Composer elimina las inclusiones manuales de archivos y es el enfoque estándar en las aplicaciones PHP modernas.
Pruébalo tú mismo
<?php
// TODO: Requerir el autoloader de vendor/autoload.php
// TODO: Usar la palabra clave 'use' para importar App\Models\Product
// TODO: Usar la palabra clave 'use' para importar App\Models\Customer
// TODO: Crear un Product con el nombre "Laptop" y el precio 999
// TODO: Crear un Customer con el nombre "Alice"
// TODO: Imprimir el resultado de greet() del cliente
// TODO: Imprimir el resultado de getInfo() del producto
?>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
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - Calculadora de Formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeResumen - Colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy