# Modul Pembelajaran: PHP Static & Constants

## Bagian 1: Static Property & Method

### 1.1. Konsep Dasar
Keyword `static` digunakan untuk mendefinisikan property atau method yang melekat pada **Class** itu sendiri, bukan pada instance (objek).

Artinya:
-   Kita bisa mengaksesnya tanpa perlu membuat objek (`new`).
-   Nilainya dibagi (shared) ke semua instance class tersebut.

### 1.2. Static Property
```php
class MathHelper {
    public static $pi = 3.14;
}

// Akses langsung
echo MathHelper::$pi; 

// Mengubah nilai (berlaku global)
MathHelper::$pi = 3.14159;
```

### 1.3. Static Method
```php
class MathHelper {
    public static function square($num) {
        return $num * $num;
    }
}

echo MathHelper::square(4); // 16
```

---

## Bagian 2: Class Constants

### 2.1. Konsep Dasar
Constant adalah nilai yang **tidak bisa diubah** (immutable) setelah didefinisikan.
-   Didefinisikan dengan keyword `const`.
-   Tidak menggunakan tanda dollar `$`.
-   Biasanya ditulis dengan HURUF_KAPITAL.

### 2.2. Contoh Penggunaan
```php
class Lingkaran {
    const PI = 3.14;
    
    public function hitungLuas($r) {
        return self::PI * $r * $r;
    }
}

echo Lingkaran::PI;
```

### 2.3. Visibility Constant (PHP 7.1+)
Sejak PHP 7.1, constant bisa memiliki visibility (`public`, `protected`, `private`).

```php
class Database {
    private const DB_PASS = "rahasia";
}
```

---

## Bagian 3: `self::` vs `$this`

Ini adalah konsep yang sering membingungkan pemula.

| Keyword | Merujuk Ke | Kapan Dipakai? |
| :--- | :--- | :--- |
| `$this->` | **Object** (Instance) saat ini | Mengakses property/method non-static. |
| `self::` | **Class** saat ini | Mengakses property static, method static, dan constant. |

**Aturan Penting:**
Di dalam static method, kita **TIDAK BISA** menggunakan `$this`, karena static method bisa dipanggil tanpa adanya objek.

---

## Bagian 4: Late Static Binding (`static::`)

### 4.1. Masalah pada Inheritance
`self::` memiliki keterbatasan: dia selalu merujuk ke class dimana kode itu **DITULIS**, bukan class yang dipanggil saat runtime.

```php
class A {
    public static function who() { echo "A"; }
    public static function test() { self::who(); }
}

class B extends A {
    public static function who() { echo "B"; }
}

B::test(); // Output: A (Padahal kita ingin B)
```

### 4.2. Solusi: `static::`
`static::` merujuk ke class yang **MEMANGGIL** method tersebut (Runtime binding).

```php
class A {
    public static function test() { static::who(); } // Ubah self jadi static
}

B::test(); // Output: B
```

---

## Bagian 5: Kapan Menggunakan Static?

Gunakan Static jika:
1.  **Utility/Helper**: Fungsi yang tidak butuh state objek (misal: `Str::upper()`, `Math::add()`).
2.  **Global Configuration**: Nilai yang sama untuk semua objek.
3.  **Singleton Pattern**: Memastikan hanya ada satu instance class.
4.  **Factory Method**: Method untuk membuat objek (`User::create()`).

Jangan gunakan Static jika:
1.  Anda butuh menyimpan data spesifik per user/objek.
2.  Anda ingin kode mudah di-test (Unit Testing static method lebih sulit).
