Cómo cargar clases automáticamente con Composer en PHP
Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)
En este artículo, discutiremos los conceptos básicos de la carga automática en PHP y cómo cargar clases de PHP automáticamente con Composer. Explicaré por qué la carga automática es tan importante y te mostraré como usar Composer para cargar automáticamente paso a paso. También explicaré la diferencia entre los distintos tipos de carga automática en Composer.
¿Por qué necesitamos la carga automática?
Al crear aplicaciones PHP, es posible que necesites usar bibliotecas de terceros. Y, como tú sabes, si quieres usar estas bibliotecas en tu aplicación, necesitas incluirlas en tus archivos de origen usando las instrucciones require o include.
Estas instrucciones require o include funcionan bien siempre y cuando estés desarrollando aplicaciones pequeñas. Pero a medida que tu aplicación crece, la lista de instrucciones require o include se vuelve cada vez más grande, lo cual es un poco molesto y difícil de mantener. El otro problema de este enfoque es que estás cargando las bibliotecas completas en tu aplicación, incluyendo las partes que ni siquiera estás usando. Esto ocasiona una huella de memoria más pesada para tu aplicación.
Para superar este problema, sería ideal cargar clases solo cuando realmente se necesiten. Ahí es donde entra en juego la carga automática. Básicamente, cuando usas una clase en tu aplicación, el cargador automático revisa si ya está cargada, y si no, el cargador automático carga la clase necesaria en la memoria. Así que la clase se carga sobre la marcha en donde sea necesaria; esto se conoce como cargado automático. Al usar la carga automática no necesitas incluir todos los archivos de las bibliotecas manualmente; solamente necesitas incluir el archivo del cargador automático, que contiene la lógica de la carga automática, y las clases necesarias se incluirán de manera dinámica.
Más adelante, en este artículo, veremos la carga automática con Composer. Pero primero explicaré cómo puedes implementar la carga automática en PHP sin Composer.
Cómo funciona la carga automática sin Composer
Quizá no te hayas dado cuenta, pero es posible implementar la carga automática en PHP sin Composer. La función spl_autoload_register() es la que hace que esto sea posible. La función spl_autoload_register() te permite registrar funciones que se colocarán en una cola para ser activadas de manera secuencial cuando PHP intente cargar clases que aún no estén cargadas.
Revisemos rápidamente el siguiente ejemplo para comprender cómo funciona.
1 |
<?php
|
2 |
function custom_autoloader($class) { |
3 |
include 'lib/' . $class . '.php'; |
4 |
}
|
5 |
|
6 |
spl_autoload_register('custom_autoloader'); |
7 |
|
8 |
$objFooBar = new FooBar(); |
9 |
?>
|
En el ejemplo anterior, hemos registrado la función custom_autoloader() como nuestro cargador automático personalizado usando la función spl_autoload_register(). A continuación, cuando intentes crear una instancia de la clase FooBar y esta aún no se encuentre disponible, PHP ejecutará todas las funciones registradas del cargador automático secuencialmente. Y así se llama a la función custom_autoloader, que incluye el archivo de clase necesario, y finalmente se crea una instancia del objeto. Para este ejemplo, estamos suponiendo que la clase FooBar está definida en el archivo lib/FooBar.php.
Sin la carga automática, necesitarías usar la instrucción require o include para incluir el archivo de la clase FooBar. La implementación del cargador automático es bastante sencilla en el ejemplo anterior, pero puedes usar esto como base, registrando múltiples cargadores automáticos para diferentes tipos de clases.
Sin embargo, a menudo en la práctica no tendrás que escribir tu propio cargador automático. ¡Para eso sirve Composer! En la siguiente sección, discutiremos cómo usar Composer para la carga automática en PHP.
Cómo funciona la carga automática con Composer
En primer lugar, asegúrate de instalar Composer en tu sistema si deseas seguir los ejemplos. Cuando se trata de la carga automática con Composer, existen diferentes métodos de entre los que puedes elegir.
Específicamente, Composer proporciona cuatro métodos diferentes para la carga automática de archivos:
- Carga automática de archivos
- Carga automática de mapa de clases (classmap)
- Carga automática PSR-0
- Carga automática PSR-4
De acuerdo a la documentación oficial de Composer, PSR-4 es la forma recomendada de hacer la carga automática, y analizaremos eso a detalle en la siguiente sección. En esta sección discutiremos brevemente las otras tres opciones.
Antes de que continuemos, revisemos rápidamente los pasos que necesitas llevar a cabo cuando quieres usar la carga automática con Composer.
- Define el archivo composer.json en la raíz de tu proyecto o biblioteca. Este debe contener directivas basadas en el tipo de carga automática.
- Ejecuta el comando
composer dump-autoloadpara generar los archivos necesarios que Composer usará para la carga automática.
- Incluye la instrucción
require 'vendor/autoload.php'en la parte superior del archivo en donde quieras usar la carga automática.
Carga automática: la directiva files
La carga automática de archivos funciona de manera similar a las instrucciones include o require, que te permiten cargar archivos de origen completos. Todos los archivos de origen a los que se haga referencia con la directiva files serán cargados cada vez que se ejecute tu aplicación. Esto es útil para cargar archivos de origen que no usan clases.
Para usar la carga automática de archivos, proporciona una lista de archivos en la directiva files del archivo composer.json, como se muestra en el siguiente fragmento de código.
1 |
{
|
2 |
"autoload": { |
3 |
"files": ["lib/Foo.php", "lib/Bar.php"] |
4 |
}
|
5 |
}
|
Como puedes ver, podemos proporcionar una lista de archivos que queramos cargar automáticamente con Composer en la directiva files. Después de que hayas creado el archivo composer.json en la raíz de tu proyecto con el contenido anterior, solamente necesitas ejecutar el comando composer dump-autoload para crear los archivos de carga automática necesarios. Estos serán creados dentro del directorio vendor. Finalmente, necesitas incluir la instrucción require 'vendor/autoload.php' en la parte superior del archivo en donde quieras cargar archivos automáticamente con Composer, como se muestra en el siguiente fragmento de código.
1 |
<?php
|
2 |
require 'vendor/autoload.php'; |
3 |
|
4 |
// code which uses things declared in the "lib/Foo.php" or "lib/Bar.php" file
|
5 |
?>
|
La instrucción require 'vendor/autoload.php' se asegura de que los archivos necesarios se carguen de forma dinámica.
Carga automática: la directiva classmap
La carga automática de mapa de clases es una versión mejorada de la carga automática de archivos. Solamente necesitas proporcionar una lista de directorios, y Composer escaneará todos los archivos de esos directorios. Por cada archivo, Composer creará una lista de clases que estén contenidas en ese archivo, y cada vez que se necesite una de esas clases, Composer cargará automáticamente el archivo correspondiente.
Revisemos rápidamente el archivo composer.json para hacer una demostración del cargador automático de mapa de clases.
1 |
{
|
2 |
"autoload": { |
3 |
"classmap": ["lib"] |
4 |
}
|
5 |
}
|
Ejecuta el comando composer dump-autoload, y Composer leerá los archivos contenidos en el directorio lib para crear un mapa de clases que pueda cargarse automáticamente.
Carga automática: PSR-0
PSR-0 es un estándar recomendado por el grupo PHP-FIG para la carga automática. En el estándar PSR-0 debes usar espacios de nombres para definir tus bibliotecas. Un nombre de clase completamente calificado debe reflejar la estructura \<Vendor Name>\(<Namespace>\)*<Class Name>. Además, tus clases deben guardarse en archivos que sigan la misma estructura de directorio que tienen los espacios de nombres.
Echemos un vistazo al siguiente archivo composer.json.
1 |
{
|
2 |
"autoload": { |
3 |
"psr-0": { |
4 |
"Tutsplus\\Library": "src" |
5 |
}
|
6 |
}
|
7 |
}
|
En la carga automática PSR-0, necesitas asociar espacios de nombres con directorios. En el ejemplo anterior, le estamos indicando a Composer que cualquier cosa que comience con el espacio de nombres Tutsplus\Library debería estar disponible en el directorio src\Tutsplus\Library.
Por ejemplo, si quieres definir la clase Foo en el directorio src\Tutsplus\Library, necesitas crear el archivo src\Tutsplus\Library\Foo.php como se muestra en el siguiente fragmento de código:
1 |
<?php
|
2 |
namespace Tutsplus\Library; |
3 |
|
4 |
class Foo |
5 |
{
|
6 |
//...
|
7 |
}
|
8 |
?>
|
Como puedes ver, esta clase está definida en el espacio de nombres Tutsplus\Library. Además, el nombre del archivo corresponde con el nombre de la clase. Veamos rápidamente cómo puedes cargar automáticamente la clase Foo.
1 |
<?php
|
2 |
require 'vendor/autoload.php'; |
3 |
|
4 |
$objFoo = new Tutsplus\Library\Foo(); |
5 |
?>
|
Composer cargará automáticamente la clase Foo a partir del directorio src\Tutsplus\Library.
Esa fue una breve explicación de la carga automática de archivos, de mapa de clases y PSR-0 en Composer. En la siguiente sección veremos cómo funciona la carga automática PSR-4.
Cómo funciona la carga automática PSR-4 con Composer
En la sección anterior discutimos cómo funciona la carga automática PSR-0. PSR-4 es similar a la carga automática PSR-0 en cuanto a que necesitas usar espacios de nombres, pero no necesitas emular la estructura de directorios con espacios de nombres.
En la carga automática PSR-0, debes asociar los espacios de nombres con la estructura del directorio. Como discutimos en la sección anterior, si quieres cargar automáticamente la clase Tutsplus\Library\Foo, esta debe localizarse en src\Tutsplus\Library\Foo.php. En la carga automática PSR-4 puedes acortar la estructura del directorio, lo que da como resultado una estructura de directorio mucho más sencilla en comparación con la carga automática PSR-0.
Revisaremos el ejemplo anterior; ve si puedes encontrar las diferencias.
Así se ve el archivo composer.json con la carga automática PSR-4.
1 |
{
|
2 |
"autoload": { |
3 |
"psr-4": { |
4 |
"Tutsplus\\Library\\": "src" |
5 |
}
|
6 |
}
|
7 |
}
|
Es importante mencionar que hemos agregado barras invertidas al final de los espacios de nombres. El mapeo anterior le indica a Composer que cualquier cosa que comience con el espacio de nombres Tutsplus\Library debería esta disponible en el directorio src. Así que no necesitas crear los directorios Tutsplus y Library. Por ejemplo, si solicitas la clase Tutsplus\Library\Foo, Composer intentará cargar el archivo src\Foo.php.
Es importante comprender que la clase Foo aún está definida dentro del espacio de nombres Tutsplus\Library; es solo que no necesitas crear directorios que emulen los espacios de nombres. El contenido del archivo src\Foo.php será idéntico al del archivo src\Tutsplus\Library\Foo.php de la sección anterior.
Como puedes ver, PSR-4 da como resultado una estructura de directorio mucho más simple, ya que puedes omitir la creación de directorios anidados y, al mismo tiempo, usar espacios de nombres completos.
PSR-4 es la forma recomendada para cargar automáticamente, y es ampliamente aceptada en la comunidad de PHP. ¡Deberías comenzar a usarla en tus aplicaciones si aún no lo has hecho!
Conclusión
Hoy discutimos la carga automática en PHP. Comenzando con la introducción de diferentes tipos de técnicas de Composer para la carga automática, discutimos a detalle los estándares de carga automática PSR-0 y PSR-4 en la segunda mitad del artículo.
Aprende PHP con un curso gratuito en línea
Si quieres aprender PHP, ¡consulta nuestro curso gratuito en línea sobre los fundamentos de PHP!
En este curso, aprenderás los fundamentos de la programación en PHP. Comenzarás con los conceptos básicos, aprendiendo cómo funciona PHP y escribiendo bucles y funciones simples en él. Luego avanzarás a la codificación de clases para una simple programación orientada a objetos (POO).
En el camino, aprenderás todas las habilidades más importantes para escribir aplicaciones para la web: tendrás la oportunidad de practicar cómo responder a las solicitudes GET y POST, analizar JSON, autenticar usuarios y usar una base de datos MySQL.
- GRATUITO


PHPFundamentos de PHPJeremy McPeak





