Constructor & Destructor
Lahir, Hidup, Mati
Seperti makhluk hidup, objek dalam pemrograman memiliki siklus:
new dipanggil.PHP menyediakan method khusus yang diawali dengan double underscore __.
Mereka dipanggil secara otomatis oleh PHP pada momen tertentu.
Dipanggil SAAT objek dibuat.
Digunakan...
Dipanggil SAAT objek dihancurkan.
Awal Kehidupan
Method khusus yang otomatis dijalankan tepat setelah objek dibuat menggunakan new.
Biasanya digunakan untuk inisialisasi data.
class Tanaman {
public function __construct() {
echo "Tanaman baru telah ditanam!";
}
}
$bunga = new Tanaman();
// Output: Tanaman baru telah ditanam!
Bayangkan Anda membuat objek User.
Objek User TIDAK VALID jika tidak punya nama dan email.
Constructor memaksa kita mengisi data tersebut saat lahir.
Bekal Lahir
Kita bisa menambahkan parameter pada __construct.
class User {
public $nama;
public function __construct($namaBaru) {
$this->nama = $namaBaru;
}
}
Saat membuat objek, kita WAJIB mengirim argumen.
$user = new User("Ahmad");
echo $user->nama; // Ahmad
// $user = new User(); // ERROR! Missing argument
Fitur canggih untuk menyingkat kode.
class User {
public $nama;
public function __construct($nama) {
$this->nama = $nama;
}
}
class User {
public function __construct(
public string $nama
) {}
}
Parameter constructor juga bisa punya nilai default.
class Kucing {
public function __construct($warna = "Oren") {
echo "Kucing warna $warna";
}
}
new Kucing(); // Kucing warna Oren
new Kucing("Hitam"); // Kucing warna Hitam
Akhir Kehidupan
Kebalikan dari Constructor.
Dijalankan otomatis saat objek dihapus dari memori atau saat skrip PHP selesai dieksekusi.
class FileHandler {
public function __destruct() {
echo "File ditutup. Memori dibersihkan.";
}
}
$obj = new FileHandler();
echo "Sedang bekerja...";
// ... kode lain ...
// Skrip selesai -> Destructor jalan otomatis
Output: Sedang bekerja... File ditutup. Memori dibersihkan.
Kita bisa memicu destructor lebih awal dengan unset().
$obj = new FileHandler();
unset($obj); // Destructor jalan SEKARANG
echo "Selesai.";
Koneksi Database
Kita ingin membuat class Database.
Saat dibuat, dia konek ke DB.
Saat selesai, dia putus koneksi.
class Database {
public $koneksi;
public function __construct($host, $user) {
$this->koneksi = "Connect to $host as $user";
echo "Koneksi dibuka.
";
}
public function query($sql) {
echo "Menjalankan: $sql
";
}
public function __destruct() {
echo "Koneksi ditutup.
";
}
}
$db = new Database("localhost", "root");
$db->query("SELECT * FROM users");
PHP TIDAK mendukung multiple constructor (Overloading) seperti Java/C++.
Satu class hanya boleh punya SATU __construct.
Gunakan Static Factory Method jika butuh cara pembuatan yang berbeda.
class User {
public static function fromJson($json) { ... }
public static function fromXml($xml) { ... }
}
Jika Child Class punya constructor, constructor Parent TIDAK jalan otomatis.
Harus panggil parent::__construct().
class Anak extends Ayah {
public function __construct() {
parent::__construct(); // Panggil ayah dulu
echo "Anak lahir.";
}
}
Constructor bisa dibuat private.
Ini digunakan pada Design Pattern Singleton (hanya boleh ada 1 objek).
class Koneksi {
private static $instance;
private function __construct() {} // Gak bisa di-new dari luar
public static function get() {
if (!self::$instance) self::$instance = new self();
return self::$instance;
}
}
Hati-hati melempar Exception di dalam __destruct.
Bisa menyebabkan Fatal Error jika terjadi saat shutdown sequence.
Objek dihancurkan dengan urutan LIFO (Last In First Out) jika saling berkaitan, tapi tidak selalu dijamin.
Sebaiknya inisialisasi semua property di Constructor agar objek selalu dalam state yang valid (konsisten).
Constructor adalah tempat terbaik untuk menyuntikkan ketergantungan (Dependency Injection).
class OrderService {
public function __construct(
private PaymentGateway $payment
) {}
}
Constructor tidak boleh mengembalikan nilai (return value).
Dia selalu mengembalikan instance objek itu sendiri secara implisit.
Sama seperti constructor, destructor Child tidak otomatis memanggil destructor Parent.
Gunakan parent::__destruct() jika perlu.
PHP punya Garbage Collector (GC). Tapi Circular Reference (A nyimpen B, B nyimpen A) bisa bikin memori bocor jika tidak ditangani.
__construct: Persiapan (Inisialisasi).__destruct: Bersih-bersih (Cleanup).Siklus Selesai.