Hari 26: Dependency Injection & Container
60 min
Last updated 09 Apr 2026
Dependency Injection
DI adalah teknik menyuplai dependensi dari luar, bukan membuat sendiri di dalam class. Ini membuat kode lebih testable dan fleksibel.
// Tanpa DI — sulit di-test
class OrderService {
private $mailer;
public function __construct() {
$this->mailer = new EmailMailer(); // hardcoded!
}
}
// Dengan DI — fleksibel
interface MailerInterface {
public function send(string $to, string $msg): void;
}
class EmailMailer implements MailerInterface {
public function send(string $to, string $msg): void {
echo "[EMAIL ke $to]: $msg\n";
}
}
class OrderService {
public function __construct(private MailerInterface $mailer) {}
public function buat(string $user, float $total): void {
echo "Order dibuat: $user — Rp$total\n";
$this->mailer->send($user, "Order berhasil! Total: Rp$total");
}
}
$service = new OrderService(new EmailMailer());
$service->buat("budi@example.com", 250000);
💡
Notice: Type hint dengan interface (bukan concrete class) adalah prinsip DIP (Dependency Inversion Principle).
Assignment
Implementasi DI: buat interface Logger dengan method log(string $msg). Buat ConsoleLogger (echo "[CONSOLE] $msg"). Buat class App yang menerima Logger via constructor. Buat app->run() yang log "Aplikasi berjalan".
Expected output:
[CONSOLE] Aplikasi berjalan
PHP
index.php
Solution
Output