# Modul Pembelajaran: PHP Constructor & Destructor

## Bagian 1: Konsep Siklus Hidup (Lifecycle)

Setiap objek dalam pemrograman memiliki siklus hidup, mirip seperti makhluk hidup:
1.  **Lahir (Creation)**: Saat objek dibuat menggunakan keyword `new`.
2.  **Hidup (Utilization)**: Saat objek digunakan (method dipanggil, property diakses).
3.  **Mati (Destruction)**: Saat objek dihapus dari memori atau skrip selesai berjalan.

PHP menyediakan **Magic Methods** untuk mengintervensi momen kelahiran dan kematian ini:
-   `__construct()`: Dijalankan saat lahir.
-   `__destruct()`: Dijalankan saat mati.

---

## Bagian 2: Constructor (`__construct`)

### 2.1. Pengertian
Constructor adalah method khusus yang otomatis dijalankan **tepat setelah** objek dibuat.
Fungsi utamanya adalah untuk **inisialisasi properti**.

### 2.2. Contoh Dasar
```php
class User {
    public function __construct() {
        echo "Objek User telah dibuat!";
    }
}

$u = new User(); // Output: Objek User telah dibuat!
```

### 2.3. Constructor dengan Parameter
Kita bisa memaksa pengguna class untuk mengirimkan data saat membuat objek.

```php
class User {
    public $nama;

    public function __construct($nama) {
        $this->nama = $nama;
    }
}

$budi = new User("Budi"); // Wajib ada parameter
echo $budi->nama; // Budi
```

### 2.4. Constructor Property Promotion (PHP 8.0+)
Fitur ini menyingkat penulisan constructor secara drastis.

**Cara Lama:**
```php
class Point {
    public $x;
    public $y;
    public function __construct($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }
}
```

**Cara Baru (PHP 8):**
```php
class Point {
    public function __construct(
        public float $x,
        public float $y
    ) {}
}
```

---

## Bagian 3: Destructor (`__destruct`)

### 3.1. Pengertian
Destructor adalah method khusus yang dijalankan saat objek **dihancurkan** atau dihapus dari memori.
Fungsi utamanya adalah untuk **cleanup** (bersih-bersih), seperti menutup koneksi database, menutup file, dll.

### 3.2. Contoh
```php
class FileLogger {
    public function __construct() {
        echo "Membuka file log...<br>";
    }

    public function log($msg) {
        echo "Menulis: $msg<br>";
    }

    public function __destruct() {
        echo "Menutup file log.<br>";
    }
}

$logger = new FileLogger();
$logger->log("Error terjadi");
// Saat skrip selesai, destructor jalan otomatis.
```

---

## Bagian 4: Best Practices

1.  **Inisialisasi Lengkap**: Pastikan objek dalam keadaan valid setelah constructor selesai. Jangan biarkan ada properti penting yang kosong (null).
2.  **Dependency Injection**: Gunakan constructor untuk menerima dependency (objek lain yang dibutuhkan).
    ```php
    class OrderService {
        public function __construct(protected PaymentGateway $payment) {}
    }
    ```
3.  **Hindari Logika Berat**: Constructor sebaiknya hanya melakukan inisialisasi sederhana. Jangan melakukan query database berat atau API call di constructor jika tidak benar-benar perlu.
4.  **Parent Constructor**: Jika class Anda adalah turunan (Child), jangan lupa panggil `parent::__construct()` jika ingin menjalankan logika inisialisasi milik Parent.

```php
class Manager extends Karyawan {
    public function __construct($nama) {
        parent::__construct($nama); // Panggil constructor Parent
        // Logika tambahan Manager
    }
}
```
