class Model {
function run (){
$db = mysqli(HOST, PORT); // тут мы жёстко задаём имя класса и настройки, так что если захотим что-то изменить придётся открывать код и править его, а если захотим выполнить модульный тест - то задолбаемся код менять.
$db->query(…)
}
IoC (inversion of control) - это способ отделить код от связей. Связи выносятся в конфигурацию, код - в объекты. Чтобы всё работало придуманы интерфейсы.
IoC можно реализовать по разной схеме, две из них - это DI (dependency injection) и SL (service locator).
DI:
interface iDB {
function query(…);
}
class DB implements iDB {
function query(…) {…}
}
class Model {
function __construct (iDB $db){
$this->db = $db;
}
function run (){
$this->db->query(…);
}
}
$db = new DB;
$model = new Model($db);
$model->run();
SL:
interface iDB {
function query(…);
}
class DB implements iDB {
function query(…) {…}
}
class Model {
function __construct (){
$this->db = DBManager::getDB();
}
function run (){
$this->db->query(…);
}
}
$model=new Model;
$model->run();
А "схема сборки" хранится отдельно.
Представьте себе детский конструктор. Одинаковых деталек хуева гора, но из них можно сложить и паровоз, и самолёт, и даже трактор. Кубики одни, а схема - разная. Детальки - это объекты, схема сборки - это IoC-конфигурация, сборщик - это IoC-конвейер, программист занимается составлением схемы и выпиливанием недостающих деталек.