PHP-DI para PHP: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a PHP-DI: qué es y para qué sirve

\n\n

PHP-DI (PHP Dependency Injection) es una potente biblioteca para la inyección de dependencias (Dependency Injection, DI) en aplicaciones PHP. Implementa el patrón Inversion of Control (IoC) y proporciona un contenedor para la resolución automática de dependencias entre clases.

\n\n

¿Para qué sirve PHP-DI? En proyectos PHP modernos (especialmente en frameworks como Laravel, Symfony, Slim), las clases a menudo dependen de otras clases. Sin un contenedor DI, tienes que crear manualmente todas las dependencias, lo que conduce a:

\n
    \n
  • Alto acoplamiento del código (tight coupling)
  • \n
  • Dificultad para realizar pruebas
  • \n
  • Duplicación de código al crear objetos
  • \n
  • Dificultades con el mantenimiento y la expansión
  • \n
\n\n

PHP-DI resuelve estos problemas determinando automáticamente qué clases necesita tu código y creándolas con las dependencias correctas. La biblioteca soporta:

\n
    \n
  • Inyección automática a través del constructor
  • \n
  • Definición de dependencias mediante anotaciones (phpDoc)
  • \n
  • Configuración a través de arrays, YAML o archivos PHP
  • \n
  • Carga diferida (lazy loading)
  • \n
  • Integración con frameworks populares
  • \n
\n\n

Instalación de PHP-DI

\n\n

PHP-DI se instala a través de Composer, el gestor de paquetes estándar para PHP:

\n\n
composer require php-di/php-di
\n\n

Si usas el framework Slim, instala el paquete de integración:

\n\n
composer require php-di/slim-bridge
\n\n

Para Symfony hay un paquete separado:

\n\n
composer require php-di/symfony-bridge
\n\n

Después de la instalación, incluye el cargador automático de Composer en tu proyecto:

\n\n
require __DIR__ . '/vendor/autoload.php';
\n\n

Inicio rápido con un ejemplo de código

\n\n

Veamos un ejemplo muy simple de uso de PHP-DI. Supongamos que tenemos una clase Mailer que depende de la clase Logger:

\n\n
<?php\n// Clase Logger\nclass Logger {\n    public function log($message) {\n        echo "[LOG]: " . $message . "\\n";\n    }\n}\n\n// Clase Mailer, que depende de Logger\nclass Mailer {\n    private $logger;\n    \n    public function __construct(Logger $logger) {\n        $this->logger = $logger;\n    }\n    \n    public function send($to, $subject) {\n        $this->logger->log("Enviando correo a {$to}: {$subject}");\n        // Lógica de envío...\n    }\n}\n\n// Creamos el contenedor DI\n$container = new DI\\Container();\n\n// Obtenemos el objeto Mailer — todas las dependencias se resuelven automáticamente\n$mailer = $container->get('Mailer');\n$mailer->send('user@example.com', '¡Hola!');\n?>
\n\n

En este ejemplo, PHP-DI crea automáticamente una instancia de Logger y la pasa al constructor de Mailer. No necesitas escribir new Logger() — el contenedor lo hace por ti.

\n\n

Métodos y funciones principales de PHP-DI

\n\n

1. Container::get() — obtener un objeto del contenedor

\n

Qué hace: Extrae un objeto por su nombre (clase, interfaz o alias) del contenedor. Si el objeto aún no se ha creado, el contenedor lo crea junto con todas sus dependencias.

\n

Parámetros:

\n
    \n
  • string $name — nombre de la clase, interfaz o alias
  • \n
\n

Ejemplo:

\n
$container = new DI\\Container();\n$logger = $container->get('Logger'); // Crea y devuelve el objeto Logger\n$mailer = $container->get('Mailer'); // Crea Mailer con Logger dentro
\n\n

2. Container::set() — registro de una definición

\n

Qué hace: Registra una definición para una clase, interfaz o alias. Permite especificar cómo se debe crear el objeto.

\n

Parámetros:

\n
    \n
  • string $name — nombre de la clase o alias
  • \n
  • mixed $definition — des

Recommendations