IoC es simplemente un paradigma de diseño, la idea es invertir el control en lugar de dependencias fijas a interfaces, ej:
Código PHP:
Ver originalclass Auto {
public function __construct()
{
$this->motor = new Motor4cil();
$this->puertas = new 2Puertas();
$this->llantas = new LlantasDeInvierno();
}
}
A usar interfaces abstractas:
Código PHP:
Ver originalclass Auto
{
public function setMotor(InterfaceMotor $motor)
{
$this->motor = $motor;
}
// etc
}
// Luego en algún bootstrap
$auto = new Auto();
$motor = Motor::factory('config.motor');
$auto->setMotor($motor);
Es decir el control es invertido, ya no lo tiene la clase Auto, si no lo tiene el archivo de configuración donde se describe el comportamiento de la aplicación.
Van de la mano porque necesitas hacer tu diseño se comporte en base a inyeccion de dependencias, y luego va más alla al usar IoC.
Saludos.