PHP, la manera correcta

6.1. Entendiendo la inyección de dependencias

Para mostrar la inyección de dependencias en la práctica, vamos a ver un ejemplo muy sencillo. En este caso tenemos una clase llamada Database que requiere de un adaptador para poder comunicarse con la base de datos. En la primera versión del código se instancia el adaptador en el mismo constructor de la clase, lo que crea una dependencia muy fuerte entre estas dos partes del código. Este acoplamiento entre la clase Database y el adaptador hace que por ejemplo sea mucho más difícil testear el código.

<?php
namespace Database;

class Database
{
    protected $adapter;

    public function __construct()
    {
        $this->adapter = new MySqlAdapter;
    }
}

class MysqlAdapter {}

A continuación se refactoriza este código para utilizar la inyección de dependencias y por tanto, para reducir la dependencia entre los componentes de código.

<?php
namespace Database;

class Database
{
    protected $adapter;

    public function __construct(MySqlAdapter $adapter)
    {
        $this->adapter = $adapter;
    }
}

class MysqlAdapter {}

Ahora la clase Database no crea el adaptador, sino que utiliza el adaptador que se le pasa a su constructor. En otras palabras, la aplicación le está pasando a la clase Database las dependencias que necesita. Además del constructor, el adaptador también se podría pasar mediante un método setter o mediante la propiedad $adapter si esta fuera pública.