Dependency Injection (DI) — это паттерн проектирования, реализующий принцип инверсии управления (IoC), где зависимости не создаются внутри класса, а передаются извне. Это фундаментальная практика современного PHP-разработки.
class OrderService {
private $paymentGateway;
public function __construct(PaymentGateway $gateway) {
$this->paymentGateway = $gateway;
}
}
class Logger {
private $writer;
public function setWriter(LogWriter $writer) {
$this->writer = $writer;
}
}
interface LoggerAware {
public function setLogger(Logger $logger);
}
Продвинутая реализация DI, которая:
Пример простого контейнера:
class Container {
private $services = [];
public function register(string $class, callable $factory) {
$this->services[$class] = $factory;
}
public function resolve(string $class) {
if (isset($this->services[$class])) {
return $this->services[$class]($this);
}
return new $class();
}
}
Без DI:
class OrderProcessor {
public function process() {
$validator = new OrderValidator();
$repository = new OrderRepository();
// ...
}
}
С DI:
class OrderProcessor {
private $validator;
private $repository;
public function __construct(
OrderValidator $validator,
OrderRepository $repository
) {
$this->validator = $validator;
$this->repository = $repository;
}
}
Пример использования PHP-DI:
use DI\ContainerBuilder;
$builder = new ContainerBuilder();
$builder->addDefinitions([
'Database' => function() {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
}
]);
$container = $builder->build();
$db = $container->get('Database');