Refactorizar código estructurado en clases reutilizables marca la diferencia entre un proyecto funcional y uno profesional. La inyección de dependencias en PHP te permite separar responsabilidades, intercambiar servicios y escalar tu sistema sin romperlo. Aquí verás cómo aplicar este patrón sobre un chat con inteligencia artificial.
¿Qué significa programar con intención en PHP?
Programar con intención es escribir primero el resultado que quieres alcanzar, aunque la solución todavía no exista. En lugar de empezar por los detalles técnicos, declaras la acción deseada y luego construyes la implementación que la sostiene.
En el archivo bootstrap, el objetivo era claro: trabajar con un chat. Por eso la línea inicial se piensa así:
php
$app = new Chat($openAIService);
$app->start();
No hay clase Chat todavía, pero ya describiste qué quieres que ocurra. Ese es el punto de partida.
¿Qué es programar con intención? Es escribir el código como si la solución ya existiera, declarando la acción deseada antes de implementarla. Te obliga a pensar en la API pública antes que en los detalles internos.
¿Cómo aplicar inyección de dependencias en una clase Chat?
La inyección de dependencias consiste en pasar desde fuera los servicios que una clase necesita, en vez de crearlos internamente. Así puedes cambiar la tecnología sin tocar la lógica.
La nueva clase chat.php arranca con su namespace y una estructura mínima que espera recibir el servicio de chat por constructor:
php
<?php
namespace App;
class Chat
{
public function __construct(private $service) {}
public function start()
{
// algoritmo de pregunta y respuesta
}
}
La propiedad `$service` se declara como *private* dentro del constructor usando la sintaxis moderna de PHP, lo que mantiene una sola línea para propiedad y parámetro. Ese servicio es el que vas a usar para chatear, sin importar si proviene de OpenAI o de otra plataforma.
### ¿Dónde vive cada responsabilidad del flujo?
Cada archivo cumple un papel específico, y entender ese reparto es lo que vuelve reutilizable al sistema.
- **bootstrap**: instancia el `Chat` con `new` y le inyecta el servicio de OpenAI.
- **chat.php**: contiene la lógica del método `start` y todo el algoritmo de conversación.
- **ejecutable (bing.ai)**: solo invoca `$app->start()` para iniciar la interacción.
El ejecutable queda limpio: recibe el objeto ya configurado y dispara el método de arranque. Toda la complejidad vive dentro de la clase.
## ¿Por qué la inyección de dependencias hace crecer tu sistema?
Porque desacopla el qué del cómo. La clase `Chat` no sabe ni le importa si el servicio inyectado es OpenAI, Ollama o cualquier otro proveedor: solo confía en que ese objeto sabe responder.
> **¿Qué es la inyección de dependencias?** Es un patrón donde una clase recibe sus colaboradores desde afuera en vez de crearlos. Permite intercambiar implementaciones sin modificar la clase que los usa.
Esta separación tiene tres beneficios concretos:
1. Puedes cambiar el proveedor de IA sin reescribir la lógica del chat.
2. Tu código se vuelve testeable, porque puedes inyectar servicios falsos.
3. Cada clase tiene una sola razón para cambiar, lo que facilita el mantenimiento.
Al probar en terminal con `php bing.ai` y preguntar *qué es PHP*, el resultado es idéntico al de antes. La diferencia no está en la salida, sino en la estructura: ahora el código retorna un objeto desde `bootstrap`, declara su intención en el ejecutable y encapsula el algoritmo dentro de una clase con responsabilidad clara.
## ¿Cómo cambiar el servicio de OpenAI por Ollama?
El reto es justamente este: reemplazar el servicio inyectado sin modificar la clase `Chat`. Si tu inyección está bien diseñada, basta con cambiar la línea del *bootstrap* donde instancias el servicio y pasarlo al constructor del chat.
- Crea o importa el servicio equivalente para Ollama.
- Cámbialo en `bootstrap` al instanciar `new Chat($ollamaService)`.
- Verifica que la clase `Chat` no necesite ningún ajuste interno.
Si tuviste que tocar `chat.php` para que funcione, entonces el acoplamiento todavía existe. Cuéntame en los comentarios cómo te fue con la implementación en Ollama y qué ajustes necesitaste.