Learn
← Previous Next →

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