Silex, el manual oficial

5.1. Inyección de dependencias

Nota Puedes saltarte esta sección si ya sabes lo que es la inyección de dependencias.

La inyección de dependencias es un patrón de diseño en el que las dependencias se pasan directamente a los servicios, en vez de crearlas dentro de los propios servicios o en vez de utilizar variables globales. Si se utiliza bien, la inyección de dependencias hace que el código resultante esté más desacoplado, sea más flexible y fácil de testear y se pueda reutilizar más fácilmente.

El siguiente ejemplo muestra una clase que toma un objeto de tipo User y lo almacena en un archivo con formato JSON:

class JsonUserPersister
{
    private $basePath;

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

    public function persist(User $user)
    {
        $data = $user->getAttributes();
        $json = json_encode($data);
        $filename = $this->basePath.'/'.$user->id.'.json';
        file_put_contents($filename, $json, LOCK_EX);
    }
}

En este ejemplo sencillo la dependencia es la propiedad basePath. Como su valor se pasa al constructor, se pueden crear diferentes instancias de este objeto con diferentes valores para esta propiedad. Las dependencias no se restringen solo a cadenas de texto. De hecho, muchas veces las dependencias son otros servicios.

Un DIC o "contenedor de servicios" es el responsable de crear y guardar los servicios de la aplicación. Además puede crear las dependencias que necesitan los servicios, incluso recursivamente, y puede inyectarlas directamente a esos servicios. Todo esto lo hace bajo demanda, lo que significa que un servicio solo se crea si realmente se va a utilizar.