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 cargador automático funciona, pero los proyectos PHP reales usan Composer para gestionar la carga automática. Composer lee la configuración de tu proyecto y genera un cargador automático optimizado que sigue los estándares PSR-4.
La configuración se encuentra en un archivo composer.json en la raíz de tu proyecto. Así es como defines las reglas de carga automática:
{
"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 autocargador en un directorio vendor/.
Para usar el cargador automático 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 instrucción require gestiona la carga de todas las clases de todo tu proyecto! Puedes definir varias asignaciones de espacios de nombres si es necesario:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}Punto clave: El autocargador de Composer elimina las inclusiones manuales de archivos y garantiza una carga coherente de clases en todo tu proyecto. Es el enfoque estándar utilizado por prácticamente todas las aplicaciones y frameworks modernos de PHP.
Desafío
FácilConstruyamos una pequeña aplicación que utilice el enfoque de carga automática de Composer para organizar clases en varios 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 funcionan juntos:
src/Models/Product.php: Define una claseProducten el espacio de nombresApp\Models. Debe tener las propiedadespublic $nameypublic $price, un constructor que acepte y establezca 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 establezca el nombre, y un métodogreet()que devuelva"Welcome, [name]!".vendor/autoload.php: Crea un cargador automático simple utilizandospl_autoload_registerque imite el comportamiento de Composer. Debe asociar el prefijo del espacio de nombresApp\con el directoriosrc/, convirtiendo los separadores de espacios de nombres en separadores de directorios y añadiendo.phppara cargar el archivo correcto.index.php: Este es tu archivo de entrada. Requiere el cargador automático desdevendor/autoload.phpen una sola línea y, después, utiliza 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 y agetInfo()en el producto (cada uno en su propia línea).
El concepto clave aquí es que tu index.php solo necesita una instrucción require para cargar el cargador automático; después de eso, todas las clases se cargan automáticamente cuando las utilizas. Así es exactamente como funcionan los frameworks y las aplicaciones PHP modernas con Composer.
Pruébalo tú mismo
<?php
// TODO: Requiere el autoloader de vendor/autoload.php
// TODO: Usa la palabra clave 'use' para importar App\Models\Product
// TODO: Usa la palabra clave 'use' para importar App\Models\Customer
// TODO: Crea un Product con nombre "Laptop" y precio 999
// TODO: Crea un Customer con nombre "Alice"
// TODO: Imprime el resultado de greet() del customer
// TODO: Imprime el resultado de getInfo() del product
?>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 la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - 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 __unserializeRepaso: 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)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online