# Modul Pembelajaran: PHP Class & Object

## Bagian 1: Definisi Class & Object

### 1.1. Analogi Pabrik
Untuk memahami Class dan Object, bayangkan sebuah **Pabrik Mobil**.
-   **Class**: Adalah gambar desain (blueprint) atau cetakan mobil. Di sini didefinisikan spesifikasi mesin, bentuk body, dll. Class itu sendiri **bukan** mobil, hanya konsep.
-   **Object**: Adalah mobil asli yang keluar dari jalur produksi. Dari satu desain (Class), kita bisa membuat ribuan mobil (Object).

### 1.2. Definisi Teknis
-   **Class**: Struktur kode yang mendefinisikan properti (data) dan method (fungsi) untuk sebuah entitas.
-   **Object**: Instance (wujud nyata) dari sebuah class yang tersimpan di memori komputer.

---

## Bagian 2: Syntax Dasar

### 2.1. Membuat Class
Gunakan keyword `class`. Nama class disarankan menggunakan **PascalCase**.

```php
class Mahasiswa {
    // Body class
}
```

### 2.2. Membuat Object (Instansiasi)
Gunakan keyword `new`.

```php
$mhs1 = new Mahasiswa();
$mhs2 = new Mahasiswa();
```

---

## Bagian 3: Property & Method

### 3.1. Property
Property adalah variabel yang hidup di dalam class. Ia menyimpan data/state dari objek.
Harus dideklarasikan dengan visibility (`public`, `protected`, `private`).

```php
class Mahasiswa {
    public $nama;
    public $nim;
    public $jurusan = "Teknik Informatika"; // Default value
}
```

### 3.2. Method
Method adalah fungsi yang hidup di dalam class. Ia mendefinisikan perilaku/aksi objek.

```php
class Mahasiswa {
    public function perkenalan() {
        echo "Halo, nama saya mahasiswa.";
    }
}
```

### 3.3. Mengakses Member
Gunakan operator panah (`->`) untuk mengakses property atau method dari sebuah objek.

```php
$budi = new Mahasiswa();
$budi->nama = "Budi Santoso"; // Set property
echo $budi->nama; // Get property
$budi->perkenalan(); // Call method
```

---

## Bagian 4: Keyword `$this`

### 4.1. Masalah Scope
Di dalam method, kita tidak bisa memanggil property begitu saja.

```php
class User {
    public $name;
    
    public function sayHello() {
        // echo "Hello " . $name; // ERROR! Undefined variable $name
    }
}
```

### 4.2. Solusi `$this`
`$this` adalah variabel khusus (pseudo-variable) yang merujuk pada **Objek Saat Ini**.

```php
class User {
    public $name;
    
    public function sayHello() {
        echo "Hello " . $this->name; // Benar
    }
}

$a = new User(); $a->name = "A";
$a->sayHello(); // $this merujuk ke objek $a -> Output: Hello A

$b = new User(); $b->name = "B";
$b->sayHello(); // $this merujuk ke objek $b -> Output: Hello B
```

---

## Bagian 5: Tips & Best Practices

1.  **Satu File Satu Class**: Simpan setiap class di file terpisah dengan nama yang sama. Contoh: `class User` disimpan di `User.php`.
2.  **Naming Convention**:
    -   Class: `PascalCase` (`UserProfile`)
    -   Method/Property: `camelCase` (`getFullName`, `firstName`)
3.  **Visibility**: Jangan biasakan semua `public`. Gunakan `private` atau `protected` untuk data sensitif (Encapsulation).

---

## Bagian 6: Latihan

Buatlah class `PersegiPanjang` dengan:
1.  Property: `$panjang`, `$lebar`.
2.  Method: `hitungLuas()`, `hitungKeliling()`.
3.  Buat objeknya, isi nilainya, dan tampilkan luas serta kelilingnya.

```php
class PersegiPanjang {
    public $panjang;
    public $lebar;

    public function hitungLuas() {
        return $this->panjang * $this->lebar;
    }
}

$pp = new PersegiPanjang();
$pp->panjang = 10;
$pp->lebar = 5;
echo "Luas: " . $pp->hitungLuas(); // 50
```
