Relasi Antar Objek

"Membangun Sistem Lewat Kolaborasi Class"

Object-Oriented Programming (OOP) PHP

Pertemuan 12

Tujuan Pembelajaran

  • Mahasiswa memahami bahwa dalam dunia nyata, satu objek tunggal tidak bisa bekerja sendirian. Objek harus berinteraksi.
  • Mahasiswa dapat membedakan 4 jenis relasi utama: Dependency, Association, Aggregation, dan Composition.
  • Mahasiswa mampu mengimplementasikan relasi antar objek dalam kode PHP, terutama perbedaan antara "Has-A" (Agregasi) dan "Has-A" yang mutlak (Komposisi).

Analogi Dunia Nyata

Sejauh ini, kita hanya membuat objek yang berdiri sendiri (seperti $mahasiswa = new Mahasiswa()). Namun, sistem perangkat lunak yang kompleks adalah kumpulan objek yang saling mengobrol dan terhubung.

Contoh Kasus Sistem Kampus
Di sebuah Universitas, terdapat entitas: Mahasiswa, Dosen, Jurusan, Ruang Kelas, dan Mata Kuliah.
  • Apakah Mahasiswa adalah bagian dari Jurusan?
  • Apakah Dosen hanya berinteraksi dengan Mahasiswa?
  • Jika gedung Kampus digusur (dihancurkan), apakah Ruang Kelas ikut hancur? Bagaimana dengan Dosennya, apakah ikut hancur/mati?
Jawaban dari pertanyaan "Keterikatan Takdir" inilah yang mendefinisikan jenis Relasi OOP.

1. Dependency (Ketergantungan Sesaat)

Hubungan paling lemah. Objek A "menggunakan" Objek B (Uses-A) hanya untuk sementara waktu, biasanya dimasukkan lewat argumen/parameter fungsi.

// Class Printer bisa mencetak apapun
class Printer {
    public function cetak($teks) { 
        echo "Mencetak: " . $teks; 
    }
}

// Class Karyawan 'Bergantung' pada Printer secara sesaat
class Karyawan {
    // Printer hanya lewat sebagai parameter (Dependency)
    public function buatLaporan(Printer $mesin, $isiLaporan) {
        $mesin->cetak($isiLaporan);
    }
}

2. Association (Asosiasi)

Hubungan struktural antara dua class yang berdiri sejajar. Keduanya saling mengenal, tetapi memiliki siklus hidup sendiri-sendiri (tidak ada yang mengatur "hidup-matinya" objek lain).

class Dokter {
    public $nama;
    public function periksa(Pasien $pasien) {
        echo "Dokter " . $this->nama . " memeriksa " . $pasien->nama;
    }
}

class Pasien {
    public $nama;
}

// Keduanya diciptakan terpisah. Jika Dokter berhenti bekerja, Pasien tetap hidup.
$drAndi = new Dokter();
$pasienBudi = new Pasien();

3. Aggregation (Agregasi)

Hubungan "Has-A" (Memiliki) yang lemah. Objek B adalah bagian dari Objek A, TAPI jika Objek A dihancurkan, Objek B tetap bisa hidup dan dipindahkan ke tempat lain.

// Contoh: Perpustakaan MEMILIKI Buku.
class Perpustakaan {
    private $koleksiBuku = [];
    
    // Buku dimasukkan DARI LUAR (Injection)
    public function tambahBuku(Buku $bukuBaru) {
        $this->koleksiBuku[] = $bukuBaru;
    }
}

$bukuPHP = new Buku("Belajar OOP");
$perpusKota = new Perpustakaan();
$perpusKota->tambahBuku($bukuPHP);

// Jika $perpusKota bangkrut dan dihapus, $bukuPHP masih ada bentuk fisiknya!

4. Composition (Komposisi)

Hubungan "Has-A" yang KUAT (Takdir Kematian). Objek B adalah bagian dari Objek A, dan jika Objek A mati, Objek B WAJIB ikut mati/hancur.

// Contoh: Mobil MEMILIKI Mesin.
class Mobil {
    private $mesin;
    
    public function __construct() {
        // Objek Mesin diciptakan DI DALAM objek Mobil
        $this->mesin = new Mesin();
    }
    
    public function __destruct() {
        // Jika Mobil dihapus dari memori, Mesin otomatis musnah
    }
}

$mobilSport = new Mobil();
// Kita tidak bisa meminjam atau mengeluarkan Mesin dari Mobil tersebut.

Simulasi: Agregasi vs Komposisi

Mari kita lihat bedanya perlakuan "Penghancuran Objek Induk" pada Agregasi (Perpustakaan & Buku) dan Komposisi (Mobil & Mesin).

Pilih simulasi untuk melihat siklus hidup objek...

Logika PHP (Siklus Hidup Memori)

// Skenario Agregasi
$buku = new Buku("OOP PHP");
$perpus = new Perpustakaan();
$perpus->tambahBuku($buku);

unset($perpus); // Menghancurkan objek perpustakaan
echo $buku->judul; // VALID! Objek $buku masih ada di memori


// Skenario Komposisi
$mobil = new Mobil(); // Mesin otomatis tercipta di dalam

unset($mobil); // Menghancurkan objek mobil
// INVALID! Mesin ikut hancur. Tidak bisa diakses dari luar.

Kesimpulan

Memahami Relasi Antar Objek membantu kita membuat sistem yang masuk akal dan efisien di memori.

  • Gunakan Dependency untuk objek sekali pakai (alat).
  • Gunakan Association untuk objek yang sederajat.
  • Gunakan Aggregation jika objek anak bisa dimasukkan dari luar dan tetap berguna jika dipindahkan.
  • Gunakan Composition hanya jika objek anak mutlak tercipta bersama dan mati bersama induknya.