Constructor & Destructor
Siapkan object saat lahir dengan __construct, bereskan dengan __destruct.
Analogi: Serah Terima Kunci
Membeli rumah melibatkan serah terima: cek kondisi, terima kunci, catat meteran. Tanpa itu, kamu menempati rumah yang lampunya belum tentu nyala. Constructor (__construct) adalah serah terima objek: method spesial yang otomatis dijalankan saat new, memastikan objek lahir dalam keadaan valid dan siap pakai. Destructor (__destruct) adalah kebalikannya: bersih-bersih otomatis saat objek tidak dipakai lagi.
<?php
// Contoh 1: constructor mewajibkan data penting sejak lahir
class Siswa {
public function __construct(
public string $nama,
public array $nilai = [],
) {}
public function rataRata(): float {
return $this->nilai === [] ? 0.0
: array_sum($this->nilai) / count($this->nilai);
}
}
// Objek TIDAK BISA lahir tanpa nama: dipaksa valid sejak awal
$sinta = new Siswa("Sinta", [85, 90, 78]);
echo $sinta->rataRata(); // 84.33
// $anonim = new Siswa(); // ERROR: nama wajib diisi!Tanpa constructor, kamu harus ingat mengisi $sinta->nama = ... manual setiap kali, dan lupa sekali = objek cacat. Constructor memaksa kelengkapan di titik pembuatan. Sintaks public string $nama di parameter adalah constructor promotion (PHP 8+): otomatis jadi property, menghemat 3 baris per property.
<?php
// Contoh 2: destructor untuk bersih-bersih (studi kasus file log)
class Pencatat {
private $handle;
public function __construct(string $file) {
$this->handle = fopen($file, "a");
}
public function catat(string $pesan): void {
fwrite($this->handle, date("H:i:s") . " $pesan\n");
}
public function __destruct() {
// Otomatis dipanggil saat objek tidak dipakai lagi:
// tutup file, bebaskan resource
if (is_resource($this->handle)) {
fclose($this->handle);
}
}
}
$log = new Pencatat("app.log");
$log->catat("Aplikasi dimulai");
// ... $log selesai dipakai, __destruct menutup file otomatisDestructor jarang ditulis manual di kode sehari-hari (PHP membersihkan memori otomatis), tapi penting untuk resource eksternal: file, koneksi database, lock. Pola "buka di construct, tutup di destruct" menjamin tidak ada yang bocor.
Jebakan yang Sering Terjadi
Constructor melakukan terlalu banyak. Constructor idealnya hanya menyiapkan (isi property, validasi ringan). Jangan taruh query database, request HTTP, atau logika berat di constructor: objek jadi sulit dites dan lambat dibuat. Operasi berat taruh di method terpisah.
Lupa memanggil parent constructor di child class. Jika child mendefinisikan __construct sendiri, constructor parent tidak otomatis jalan. Wajib panggil manual: parent::__construct($nama); di baris pertama, atau inisialisasi parent tidak terjadi.
Constructor Promotion: Contoh Penuh
Promotion menghemat banyak boilerplate di class data (DTO/Model):
<?php
// Tanpa promotion (gaya lama, 12 baris):
class ProdukLama {
public string $nama;
public float $harga;
public int $stok;
public function __construct(string $nama, float $harga, int $stok) {
$this->nama = $nama;
$this->harga = $harga;
$this->stok = $stok;
}
}
// Dengan promotion (PHP 8+, 7 baris):
class Produk {
public function __construct(
public string $nama,
public float $harga,
public int $stok = 0,
) {}
}
$p = new Produk("Kopi", 15000, 10);
echo $p->nama; // "Kopi"Visibility dan default value bisa langsung di parameter. Untuk class dengan banyak property, promotion memangkas setengah kode constructor.
Catatan teknis: PHP mengeksekusi constructor sebelum property promotion diisi? Justru sebaliknya: parameter promotion diisi dulu, baru badan constructor jalan. Jadi di dalam badan constructor,
$this->namasudah tersedia.
Tantangan
Class Produk
Buat class Produk dengan constructor promotion: $nama (public), $harga (public), $stok (private, default 0). Tambah method tambahStok($jml) dan jual($jml) (return false jika stok kurang). Uji alurnya.