Constructor PHP adalah method bernama __construct(). PHP memanggilnya secara otomatis saat kamu menulis new ClassName(...), dan argumen di dalam tanda kurung menjadi parameternya, jadi objek itu langsung lahir dengan nilai yang sudah terisi.
Tanpa constructor, kamu akan membuat objek kosong lalu mengisi setiap property sesudahnya, dan tidak ada yang mencegahmu lupa mengisi salah satunya. Dengan constructor, new User() tanpa argumen menghasilkan ArgumentCountError.
Constructor property promotion
Mendeklarasikan property, menuliskannya sebagai parameter, lalu mengisi $this->name = $name berarti mengulang setiap nama tiga kali. Sejak PHP 8.0, kata kunci visibilitas di depan parameter constructor melakukan ketiganya sekaligus:
Parameter yang di-promote juga bisa readonly (public readonly string $id), yang merupakan cara terpendek untuk menulis value object yang tidak bisa diubah. Kamu boleh mencampur parameter yang di-promote dengan parameter biasa, dan body constructor tetap bisa berisi kode yang berjalan setelah property hasil promotion terisi.
Nilai bawaan dan named argument
Parameter constructor bisa punya nilai bawaan seperti fungsi lainnya. Parameter dengan nilai bawaan ditulis setelah parameter yang wajib. Dengan named argument (PHP 8.0), pemanggil bisa langsung menuju opsi yang diinginkannya tanpa mengulang setiap nilai bawaan sebelumnya:
Jalankan: output-nya berisi HTML, jadi tab Halaman menampilkan ketiga tombol itu, dan tab Output menampilkan tag yang dicetak PHP. Perhatikan tanda kurung di (new Button('Save'))->render(): sejak PHP 8.4 tanda kurung itu opsional, tetapi PHP 8.3 membutuhkannya.
Memvalidasi argumen di constructor
Constructor tidak bisa mengembalikan false atau kode error: apa pun yang dikembalikannya diabaikan. Untuk menolak input yang salah, lempar exception. Objeknya lalu tidak pernah dibuat, sehingga bagian program lainnya bisa memercayai setiap Temperature yang diterimanya.
Halaman try catch membahas cara menangkap exception seperti ini secara lebih rinci.
Beberapa constructor dengan static factory method
PHP tidak punya constructor overloading: satu class, satu __construct. Saat sebuah objek bisa dibuat dari input yang berbeda-beda (string tanggal, array, timestamp), tambahkan static method bernama yang menyiapkan argumennya lalu memanggil new static(...). Menjadikan constructor private memaksa semua orang lewat factory tersebut.
new Color(1, 2, 3) dari luar class sekarang melempar Error ("Call to private Color::__construct() from global scope"). Halaman static menjelaskan kenapa di sini dipakai new static, bukan new self.
Memanggil constructor parent dengan parent::__construct
Saat class turunan mendefinisikan constructor sendiri, constructor milik parent tidak berjalan dengan sendirinya. Panggil dengan parent::__construct(...), biasanya di awal, supaya property milik parent sudah terisi sebelum class turunan menambahkan miliknya sendiri:
Kalau class turunan sama sekali tidak punya constructor, PHP memakai milik parent, dan new Truck('Volvo') akan meneruskan argumennya langsung ke Vehicle::__construct. Selengkapnya ada di inheritance.
Lupa memanggil parent::__construct
Kesalahan ini tidak menghasilkan error di baris tempat kesalahannya terjadi. Constructor class turunan berjalan, property bertipe milik parent tetap belum diinisialisasi, dan program gagal belakangan, di mana pun property itu pertama kali dibaca:
Tambahkan parent::__construct(); sebagai baris pertama Post::__construct, lalu jalankan lagi: tanggalnya tercetak. Method yang berkaitan, __destruct(), berjalan saat referensi terakhir ke sebuah objek hilang atau saat script selesai. Method ini jarang dibutuhkan di kode sehari-hari, karena PHP menutup file dan membebaskan memori sendiri di akhir setiap request.
Pertanyaan yang sering diajukan
Apa itu __construct di PHP?
__construct() adalah constructor: method yang dipanggil PHP secara otomatis tepat setelah new membuat objeknya. Argumen yang kamu berikan ke new User('Ada', 36) dikirim ke __construct(string $name, int $age), yang biasanya menyimpannya ke property.
Apa itu constructor property promotion di PHP?
Sejak PHP 8.0, menaruh kata kunci visibilitas pada parameter constructor akan mendeklarasikan property dan mengisinya dalam satu langkah: public function __construct(private string $name) {} sama dengan mendeklarasikan private string $name; lalu menulis $this->name = $name; di body-nya.
Apakah class PHP bisa punya beberapa constructor?
Tidak. PHP tidak punya method overloading, jadi sebuah class hanya punya satu __construct. Pakai parameter opsional dengan nilai bawaan, atau tambahkan static factory method seperti public static function fromArray(array $data): static yang memanggil new static(...) dengan argumen yang tepat.
Apakah constructor parent dipanggil otomatis di PHP?
Hanya kalau class turunan tidak punya constructor sendiri. Kalau class turunan mendefinisikan __construct, constructor milik parent tidak berjalan kecuali kamu memanggil parent::__construct(...) sendiri, biasanya di baris pertama.
Apakah constructor PHP bisa mengembalikan nilai?
Tidak. new selalu memberimu objeknya, dan apa pun yang dikembalikan __construct diabaikan. Untuk melaporkan masalah, lempar exception dari constructor, misalnya throw new InvalidArgumentException('Age must be positive').