Pemrograman berorientasi objek menyusun program di sekeliling objek (object), yaitu nilai yang menggabungkan data dan perilaku dalam satu kesatuan. Topik ini membahas cara mendefinisikan kelas (class) sebagai cetak biru objek, cara membuat dan menggunakan objeknya, serta constructor beserta penulisan ringkasnya yang disebut constructor property promotion. Seluruh contoh menggunakan satu ranah yang sama, yaitu perpustakaan kampus yang memuat buku, anggota, dan peminjaman, sehingga contoh antartopik di dalam modul ini saling berkaitan.
Mendefinisikan kelas dan membuat objek#
Kelas adalah cetak biru yang menjelaskan data dan perilaku yang dimiliki setiap objek yang dibuat darinya. Data disimpan dalam properti (property), sedangkan perilaku dinyatakan sebagai fungsi di dalam kelas yang disebut metode (method). Mendefinisikan kelas belum menjalankan apa pun. Kelas baru berguna setelah objek dibuat darinya dengan kata kunci new. Satu kelas dapat menghasilkan banyak objek, dan keadaan setiap objek saling terpisah.
Akses ke anggota objek memakai operator panah -> yang ditulis tanpa spasi di sekitarnya. Properti $judul dari variabel $buku ditulis $buku->judul, yaitu nama objek diikuti panah lalu nama properti tanpa tanda dolar. Di dalam tubuh metode, kata kunci $this menunjuk objek yang sedang menjalankan metode tersebut, sehingga $this->judul berarti properti judul milik objek itu sendiri.
Skrip berikut mendefinisikan kelas Buku dengan tiga properti dan satu metode, lalu membuat dua objek dari kelas yang sama. Kedua objek diisi nilai yang berbeda, kemudian metode ringkas() dipanggil pada masing-masing objek.
<?php
declare(strict_types=1);
class Buku
{
public string $judul = '';
public string $penulis = '';
public int $tahunTerbit = 0;
public function ringkas(): string
{
return "{$this->judul} ({$this->penulis}, {$this->tahunTerbit})";
}
}
$bukuSatu = new Buku();
$bukuSatu->judul = 'Algoritma Dasar';
$bukuSatu->penulis = 'Citra';
$bukuSatu->tahunTerbit = 2021;
$bukuDua = new Buku();
$bukuDua->judul = 'Jaringan Komputer';
$bukuDua->penulis = 'Budi';
$bukuDua->tahunTerbit = 2019;
echo $bukuSatu->ringkas(), "\n";
echo $bukuDua->ringkas(), "\n";
var_dump($bukuSatu instanceof Buku);Algoritma Dasar (Citra, 2021)
Jaringan Komputer (Budi, 2019)
bool(true)Keluaran menunjukkan bahwa metode ringkas() menghasilkan teks berbeda untuk tiap objek karena $this pada setiap pemanggilan menunjuk objek yang berbeda. Operator instanceof yang dipakai pada baris terakhir memeriksa apakah sebuah nilai adalah objek yang dibuat dari kelas tertentu, dan var_dump() menegaskan bahwa $bukuSatu memang objek Buku. Properti pada contoh ditulis dengan kata kunci public. Sejak PHP 8.0, PHP menuntut deklarasi visibilitas secara eksplisit pada situasi tertentu, sehingga kata kunci visibilitas sebaiknya selalu dituliskan. Aturan lengkap kata kunci public, private, dan protected dibahas pada topik visibilitas.
Properti, metode, dan $this#
Properti dideklarasikan di dalam kelas dengan nama, visibilitas, dan tipe. Visibilitas dan tipe bersifat opsional tetapi dianjurkan, sedangkan nama wajib ada. Properti juga dapat diberi nilai awal yang berlaku untuk setiap objek baru. Nilai awal harus berupa ekspresi konstan seperti literal angka, literal string, atau array literal, bukan hasil pemanggilan fungsi. Metode ditulis seperti fungsi biasa, lengkap dengan parameter bertipe dan tipe kembalian, tetapi berada di dalam tubuh kelas sehingga hanya dapat dipanggil melalui objek atau kelasnya.
Metode membaca dan mengubah keadaan objek melalui $this. Konvensi penamaan yang lazim membuat nama metode menggambarkan tindakan, misalnya umurTahun() untuk menghitung usia buku pada suatu tahun tertentu. Metode juga dapat menerima parameter seperti fungsi biasa, sehingga data dari luar masuk ke objek secara terkendali.
Skrip berikut memperlihatkan properti bernilai awal dan dua metode yang memakai $this. Perhatikan bahwa nilai properti yang tidak diisi tetap mempunyai nilai awal, sehingga objek baru langsung berada dalam keadaan yang terdefinisi.
<?php
declare(strict_types=1);
class Buku
{
public string $judul = 'Tanpa judul';
public int $tahunTerbit = 0;
public int $jumlahHalaman = 0;
public function deskripsi(): string
{
return sprintf(
'%s, %d halaman, terbit %d',
$this->judul,
$this->jumlahHalaman,
$this->tahunTerbit
);
}
public function umurTahun(int $tahunSekarang): int
{
return $tahunSekarang - $this->tahunTerbit;
}
}
$buku = new Buku();
$buku->judul = 'Algoritma Dasar';
$buku->tahunTerbit = 2021;
$buku->jumlahHalaman = 240;
echo $buku->deskripsi(), "\n";
echo 'Umur buku pada 2024: ', $buku->umurTahun(2024), ' tahun', "\n";Algoritma Dasar, 240 halaman, terbit 2021
Umur buku pada 2024: 3 tahunConstructor dan constructor property promotion#
Constructor adalah metode khusus bernama __construct() yang PHP jalankan secara otomatis setiap kali objek dibuat dengan new. Constructor digunakan untuk inisialisasi, yaitu mengisi properti dari argumen, menetapkan keadaan awal, dan memastikan objek baru langsung layak dipakai. Argumen yang diberikan pada new Buku(...) diteruskan ke parameter constructor.
Sebelum PHP 8.0, constructor ditulis dengan pola yang panjang. Setiap parameter harus dideklarasikan ulang sebagai properti, lalu nilainya ditugaskan satu per satu melalui $this. PHP 8.0 memperkenalkan constructor property promotion, yaitu penulisan ringkas yang sekaligus mendeklarasikan properti, menandai visibilitas dan tipenya, serta menugaskan argumennya hanya dari daftar parameter constructor. Skrip berikut mendefinisikan dua kelas dengan hasil yang identik, satu dengan pola lama dan satu dengan promosi, agar perbedaannya terlihat berdampingan.
<?php
declare(strict_types=1);
class BukuLama
{
public string $judul;
public string $penulis;
public function __construct(string $judul, string $penulis)
{
$this->judul = $judul;
$this->penulis = $penulis;
}
}
class BukuBaru
{
public function __construct(
public string $judul,
public string $penulis,
public int $stok = 3,
) {
}
}
$lama = new BukuLama('Algoritma Dasar', 'Citra');
$baru = new BukuBaru('Jaringan Komputer', 'Budi');
echo $lama->judul, ' oleh ', $lama->penulis, "\n";
echo $baru->judul, ' oleh ', $baru->penulis, "\n";
echo 'Stok awal: ', $baru->stok, "\n";Algoritma Dasar oleh Citra
Jaringan Komputer oleh Budi
Stok awal: 3Perbedaan kedua pola dirangkum pada tabel berikut.
| Aspek | Pola lama | Constructor property promotion |
|---|---|---|
| Deklarasi properti | Ditulis terpisah di atas constructor | Menyatu pada daftar parameter |
| Penugasan nilai | Baris $this->judul = $judul; per properti | Otomatis oleh PHP |
| Nilai default | Ditulis pada deklarasi properti | Ditulis pada parameter, misalnya int $stok = 3 |
| Kata kunci visibilitas | Pada deklarasi properti | Pada parameter, misalnya public string $judul |
Promosi hanya boleh dipakai pada parameter constructor. Selain itu, nama parameter yang dipromosikan tidak boleh sama dengan nama properti yang sudah dideklarasikan secara terpisah. Tidak semua parameter harus dipromosikan, karena constructor tetap boleh memuat parameter biasa untuk keperluan perhitungan di dalam tubuhnya.
Kesalahan umum#
- Memanggil anggota kelas seolah fungsi bebas. Metode hanya dapat dipanggil melalui objek, sehingga
ringkas()tanpa awalan objek memicu errorCall to undefined function. Perbaikannya dengan membuat objek terlebih dahulu dan memanggil$buku->ringkas(). - Menggunakan tanda dolar ganda pada akses properti. Tulisan
$this->$judulmemakai isi variabel$judulsebagai nama properti, sedangkan yang dimaksud biasanya$this->judul. Kesalahan ini menghasilkan pesan properti tidak terdefinisi yang membingungkan karena nama propertinya terlihat benar. Ikuti aturannya, yaitu tanda dolar hanya pada variabel objek di depan, bukan pada nama properti di belakang panah. - Mengira penugasan objek menyalin isinya. Pernyataan
$salinan = $asli;tidak membuat objek kedua, melainkan membuat dua nama yang merujuk objek yang sama, sehingga perubahan melalui$salinanlangsung terlihat pada$asli. Pemahaman perilaku ini penting sebelum masuk ke mekanisme kloning pada topik Perbandingan dan Kloning Objek. - Menaruh logika berat di luar constructor. Inisialisasi yang terpecah antara constructor dan pemanggilan metode lain membuat objek dapat berada dalam keadaan setengah jadi. Kumpulkan seluruh inisialisasi wajib di dalam constructor agar setiap objek baru langsung konsisten.
Ringkasan#
- Kelas adalah cetak biru yang mendefinisikan properti dan metode, sedangkan objek adalah nilai nyata yang dibuat dari kelas dengan
newdan keadaannya saling terpisah antar objek. - Akses anggota objek memakai operator
->, dan di dalam metode,$thismenunjuk objek yang sedang menjalankan metode tersebut. - Constructor
__construct()dijalankan otomatis saat objek dibuat dan menjadi tempat seluruh inisialisasi wajib. - Constructor property promotion sejak PHP 8.0 menggabungkan deklarasi properti dan penugasannya pada daftar parameter constructor, sehingga penulisan kelas menjadi jauh lebih ringkas tanpa mengubah perilakunya.
Referensi#
- The Basics — Manual PHP
— Menetapkan sintaks kelas, pembuatan objek dengan
new, akses->, dan$this. - Properties — Manual PHP — Menjelaskan deklarasi properti, tipe, dan aturan nilai awalnya.
- Constructors and Destructors — Manual PHP
— Mendokumentasikan
__construct()dan constructor property promotion PHP 8.