"Membangun Sistem Lewat Kolaborasi Class"
Object-Oriented Programming (OOP) PHP
Pertemuan 12
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.
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); } }
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();
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!
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.
Mari kita lihat bedanya perlakuan "Penghancuran Objek Induk" pada Agregasi (Perpustakaan & Buku) dan Komposisi (Mobil & Mesin).
// 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.
Memahami Relasi Antar Objek membantu kita membuat sistem yang masuk akal dan efisien di memori.