Class PHP dideklarasikan dengan class Name { ... } dan berisi property (variabel) dan method (fungsi). new Name() membuat objek dari class itu, dan -> membaca property atau memanggil method: $user->name, $user->greet().
Class adalah cetak birunya, objek adalah satu benda yang dibuat dari cetak biru itu. Kamu bisa membuat objek sebanyak yang kamu butuhkan dari satu class, dan setiap objek punya nilai property-nya sendiri.
Property dan method
Property dideklarasikan dengan kata kunci visibilitas, tipe (opsional), dan nilai bawaan (opsional). Method adalah fungsi di dalam class. Di dalam method, $this adalah objek tempat method itu dipanggil, jadi $this->balance membaca saldo milik objek tersebut.
Setiap objek menyimpan $balance-nya sendiri: menyetor ke $a tidak menyentuh $b. Mengisi property satu per satu setelah new lama-lama merepotkan; constructor menerima nilai awalnya sebagai argumen.
public, private, dan protected
Visibilitas mengatur siapa yang boleh menyentuh property atau memanggil method:
| Kata kunci | Bisa diakses dari |
|---|---|
public | mana saja |
protected | class itu sendiri dan class yang meng-extend-nya |
private | hanya class yang mendeklarasikannya |
Membuat property menjadi private lalu menyediakan method adalah cara sebuah class melindungi aturannya sendiri. Di sini saldo hanya bisa berubah lewat deposit() dan withdraw(), yang menolak jumlah yang tidak valid:
Membaca property private dari luar class bukan sekadar warning, melainkan Error:
Property bertipe dan nilai yang belum diinisialisasi
Property bertipe tanpa nilai bawaan dimulai dalam keadaan belum diinisialisasi (uninitialized), yang berbeda dari null. Membacanya sebelum diisi apa pun akan melempar Error. Beri nilai bawaan, isi di constructor, atau buat nullable dengan ?Type dan = null.
Tipe ditegakkan saat pengisian. Dengan mode bawaan (non-strict), $p->stock = '7' mengonversi string numerik itu menjadi 7, sedangkan $p->stock = 'many' melempar TypeError.
Property readonly
Property readonly (PHP 8.1) bisa ditulis satu kali, dari dalam class, lalu tidak bisa ditulis lagi. Ini cara yang biasa untuk membuat value object seperti jumlah uang atau ID. PHP 8.2 menambahkan readonly class, yang membuat setiap property menjadi readonly.
Property readonly wajib punya tipe, dan tidak boleh punya nilai bawaan. Kalau kamu butuh salinan yang sudah diubah, buat objek baru (new Order('B-2002')) alih-alih mengedit yang lama.
Mencetak objek dengan __toString
echo $object hanya bekerja kalau class-nya mendefinisikan __toString(). Method ini mengembalikan string yang dipakai PHP setiap kali objek diperlakukan sebagai teks: di echo, dalam penggabungan string, di "{$object}".
Tanpa __toString, echo $object melempar Error ("Object of class Money could not be converted to string"). Untuk debugging, print_r() dan var_dump() bisa dipakai pada objek apa pun dan juga menampilkan property private; lihat var_dump dan print_r.
Menyimpan objek ke variabel lain tidak menyalinnya
Inilah kesalahan yang paling sering menjebak orang yang terbiasa dengan array. Menyimpan array ke variabel lain akan menyalinnya. Menyimpan objek hanya menyalin penunjuknya: kedua variabel lalu menunjuk ke objek yang sama.
clone membuat salinan dangkal: kalau sebuah property berisi objek lain, kedua salinan tetap berbagi objek di dalamnya itu. === bernilai true hanya untuk objek yang sama, sedangkan == membandingkan nilai property dari dua objek dengan class yang sama. Mengirim objek ke fungsi bekerja sama seperti pengisian variabel, jadi sebuah fungsi bisa mengubah objek yang diterimanya.
Pertanyaan yang sering diajukan
Bagaimana cara membuat objek dari class di PHP?
Pakai new dengan nama class-nya: $user = new User();. Kalau class itu punya constructor, berikan argumennya di dalam tanda kurung, seperti new User('Ada'). Setelah itu, panggil method dan baca property dengan operator panah: $user->name, $user->greet().
Apa arti $this di PHP?
$this adalah objek tempat method yang sedang berjalan dipanggil. Di dalam $ada->greet(), $this adalah $ada, jadi $this->name membaca nama Ada. Variabel ini hanya ada di dalam method yang tidak static.
Apa bedanya public, private, dan protected di PHP?
Anggota public bisa dipakai dari mana saja, anggota private hanya dari dalam class yang mendeklarasikannya, dan anggota protected dari class itu serta class turunannya. Membaca property private dari luar akan melempar Error: Cannot access private property.
Apakah objek di PHP dikirim lewat referensi?
Variabel menyimpan penunjuk (handle) ke objek, bukan objeknya sendiri. $b = $a; menyalin penunjuknya, jadi kedua variabel menunjuk ke objek yang sama dan perubahan lewat $b terlihat di $a. Pakai $b = clone $a; untuk mendapatkan salinan yang berdiri sendiri.
Apa itu property readonly di PHP?
Property yang dideklarasikan public readonly string $id; (PHP 8.1+) hanya bisa diisi sekali, dari dalam class, dan tidak bisa diubah sesudahnya. Menulisnya untuk kedua kalinya akan melempar Error: Cannot modify readonly property.