Суть DI проста до безобразия. Это похоже к примеру на MP3-плеер. Если используется внутренняя память, то для того, чтобы послушать новую музыку, нужно её изменить (записать туда что-либо). Соответственно нужно выполнить некоторые команды, которые в плеере забиты жестко.
Если используется внешняя флешка, то пофиг, как она выглядит и что на ней записано. Не нужно трогать сам плеер, нужно только сменить флешку.
В коде (упрощенно) примерно так:
class Memory
{
public function run()
{
echo 'Тра-ля-ля';
}
}
class MP3pleer
{
public function play()
{
$sounds = new Memory();
return $sounds->run();
}
}
$obj = new MP3pleer;
$obj->play();
Здесь можно использовать только и только класс Memory(). А если следовать концепции DI, то должно быть так:
class Memory
{
public function run()
{
echo 'Тра-ля-ля';
}
}
class MP3pleer
{
public function play($sounds)
{
return $sounds->run();
}
}
$obj = new MP3pleer;
$sounds = new Memory();
$obj->play($sounds);
И тогда можно использовать любой класс, главное чтобы он имел метод run().
На самом деле все немного сложнее, там нужно делать контейнер по хорошему, управлять всем хозяйством нужно конфигурацией, есть куча подводных камней и пр. Внедрять зависимости можно разными способами, как через конструктр или методы, сеттеры-геттеры или свойства напрямую. Но суть примерно такая.
Эта концепция хороша для фреймворков, которые пишутся для полной унификации (что на мой взгляд полная утопия). А по сути усложняет конструкцию как в плане прозрачности и управляемости кода, так и в плане его поддержки. Но это ИМХО, сразу предупреждаю. Не нужно никому напрягаться и что-либ пытаться доказать. :)
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.