Pada Chapter sebelumnya kita sudah melihat class sebagai cetakan dan object sebagai wujudnya. Sekarang saatnya mengisi cetakan itu dengan dua penghuninya: property sebagai tempat menyimpan data, dan method sebagai perilaku yang mengolah data tersebut. Keduanya adalah anggota class yang paling sering kita tulis sehari-hari. Pada Chapter ini kita akan membahas deklarasi property beserta nilai defaultnya, cara kerja method yang memakai $this, pemanggilan method berantai, dan perbedaan singkat antara self dan $this.

Deklarasi Property dan Nilai Default #

Property dideklarasikan di dalam tubuh class dengan kata kunci public diikuti tipe dan nama variabelnya. Nilai default ditulis dengan tanda sama dengan, persis seperti memberi nilai awal pada variabel biasa. Mari kita lihat variasinya dalam satu class:

php
<?php
class Produk
{
    public string $nama = "Tanpa nama";
    public int $harga = 0;
    public array $kategori = [];
    public ?string $kode = null;
    public bool $aktif = true;

    public function ringkas(): string
    {
        return "{$this->nama} (Rp{$this->harga})";
    }
}

$produk = new Produk();
echo $produk->ringkas() . "\n";
var_dump($produk->aktif, $produk->kode);

Output yang Dihasilkan:

text
Tanpa nama (Rp0)
bool(true)
NULL

Mari kita telaah baris-baris pentingnya:

  1. Baris 4-8: lima property dengan lima variasi nilai default — string kosong-isi, integer nol, array kosong, null untuk property nullable, dan boolean true. Semua nilai default ini harus berupa ekspresi konstanta: literal, konstanta class, atau operasi aritmetika sederhana antar nilai tetap.
  2. Baris 7 (public ?string $kode = null;): tanda ? di depan tipe berarti property ini juga boleh menyimpan NULL, dan null memang menjadi nilai awalnya. Penulisan ?string ... = null yang eksplisit seperti ini adalah bentuk yang benar di PHP 8.
  3. Baris 16-18: object baru dicetak, lalu tiga anggotanya dibaca — method ringkas() menghasilkan string gabungan, sementara var_dump() menegaskan $aktif bernilai true dan $kode bernilai NULL.

Nilai default tidak boleh melibatkan pemanggilan function karena hasilnya tidak bisa dihitung saat PHP membaca definisi class. Potongan berikut menunjukkan pola yang salah beserta perbaikannya:

php
<?php
class Konfigurasi
{
    // SALAH: time() bukan ekspresi konstanta, parser menolaknya
    // public int $dibuatPada = time();

    // BENAR: beri nilai netral dulu, isi belakangan lewat method
    public int $dibuatPada = 0;
    public string $versi = "1.0.0";
}

Aturan praktisnya: nilai yang bisa ditulis langsung boleh menjadi default; nilai yang harus dihitung saat runtime diisi kemudian melalui method atau constructor.

Property Tanpa Tipe sebagai Gaya Lama #

Deklarasi property bertipe baru tersedia sejak PHP 7.4. Pada kode yang lebih tua, property ditulis tanpa tipe sama sekali — bentuk ini masih valid hingga sekarang dan sering dijumpai pada proyek warisan:

php
<?php
class Pengguna
{
    public $nama = "Budi";
    public $umur;
}

$pengguna = new Pengguna();
var_dump($pengguna->nama, $pengguna->umur);

Output yang Dihasilkan:

text
string(4) "Budi"
NULL

Property $nama dan $umur di atas menerima nilai tipe apa saja, dan $umur yang tidak diberi default otomatis bernilai NULL tanpa protes. Senyapnya perilaku inilah yang berbahaya: salah tempel tipe atau lupa mengisi nilai tidak akan terdeteksi. Pada kode baru, selalu gunakan property bertipe agar PHP membantu menjaga kualitas data — mirip seperti type declaration pada parameter function yang sudah kita pelajari di Section Tipe Data dan Type System .

Method sebagai Perilaku Class #

Method dideklarasikan seperti function biasa, hanya saja letaknya di dalam class dan secara otomatis punya akses ke $this. Parameter, nilai default parameter, dan return type mengikuti aturan yang sama seperti function pada Section Fungsi . Mari kita rakit class keranjang belanja:

php
<?php
class Keranjang
{
    public array $isi = [];

    public function tambah(string $nama, int $jumlah = 1): void
    {
        $this->isi[$nama] = ($this->isi[$nama] ?? 0) + $jumlah;
    }

    public function totalItem(): int
    {
        return array_sum($this->isi);
    }
}

$keranjang = new Keranjang();
$keranjang->tambah("Kopi Gayo", 2);
$keranjang->tambah("Gula Aren", 3);
$keranjang->tambah("Kopi Gayo");

echo "Total item: " . $keranjang->totalItem() . "\n";

Output yang Dihasilkan:

text
Total item: 6

Mari kita bedah baris-barisnya:

  1. Baris 4: property $isi bertipe array menyimpan pemetaan nama barang ke jumlahnya, diawali array kosong.
  2. Baris 6-9: method tambah() menerima nama barang dan jumlah opsional. Baris 8 membaca jumlah lama dengan null coalescing (?? 0) untuk barang yang belum pernah ditambahkan, menjumlahkannya dengan $jumlah, lalu menyimpannya kembali ke $this->isi — property milik object yang memanggil method ini.
  3. Baris 11-14: method totalItem() menjumlahkan seluruh nilai di array $isi dengan array_sum() dan mengembalikan hasilnya sebagai integer.
  4. Baris 17-20: tiga kali pemanggilan tambah() — perhatikan baris 20 yang hanya mengirim satu argumen sehingga parameter $jumlah memakai nilai default 1.
  5. Baris 22: hasil 2 + 3 + 1 tercetak sebagai 6.

Method dengan return type void seperti tambah() tidak mengembalikan nilai apa pun; method tersebut dipanggil semata-mata untuk efek perubahan state pada object.

Method Berantai dengan return $this #

Ketika sebuah method mengembalikan object itu sendiri, pemanggilan method berikutnya bisa langsung dirangkai dengan operator ->. Pola ini disebut method chaining dan lazim dipakai pada query builder di framework:

php
<?php
class PesanBuilder
{
    public string $teks = "";

    public function tambah(string $bagian): self
    {
        $this->teks .= $bagian;
        return $this;
    }
}

$builder = new PesanBuilder();
$builder->tambah("Halo ")
    ->tambah("Budi, ")
    ->tambah("selamat belajar PHP!");

echo $builder->teks . "\n";

Output yang Dihasilkan:

text
Halo Budi, selamat belajar PHP!

Return type self pada baris 6 berarti “instance dari class ini”. Baris 9 mengembalikan $this — object yang sama yang sedang memanggil method — bukan object baru. Rantai pada baris 14-16 karenanya bekerja pada satu object yang sama: tambah() pertama mengembalikan $builder, tambah() kedua dipanggil pada object yang sama, dan seterusnya. Tanpa pengembalian $this, kita harus menulis tiga pernyataan terpisah.

Perbedaan self dan $this #

Di dalam method ada dua cara merujuk ke anggota class: $this untuk anggota milik object, dan self untuk anggota milik class. Anggota milik class contohnya konstanta, yang dideklarasikan dengan const dan nilainya tetap untuk semua object:

php
<?php
class Suhu
{
    public const FAKTOR_KONVERSI = 1.8;

    public int $celcius = 25;

    public function keFahrenheit(): float
    {
        return $this->celcius * self::FAKTOR_KONVERSI + 32;
    }
}

$suhu = new Suhu();
$suhu->celcius = 100;

echo "100 derajat C = " . $suhu->keFahrenheit() . " derajat F\n";

Output yang Dihasilkan:

text
100 derajat C = 212 derajat F

Baris 4 mendeklarasikan konstanta class FAKTOR_KONVERSI yang nilainya sama untuk seluruh object Suhu. Baris 10 mengaksesnya dengan self::FAKTOR_KONVERSI — perhatikan pemakaian :: bukan ->, karena konstanta bukan anggota object. Ringkasan praktisnya:

Aspek$thisself
Merujuk keObject yang sedang aktifClass tempat kode ditulis
MengaksesProperty dan method instanceKonstanta serta anggota static
Operator->::
Contoh$this->celciusself::FAKTOR_KONVERSI

Anggota static — property dan method milik class alih-alih object — akan kita bahas tuntas pada Chapter Static Properties dan Methods di penghujung Section ini.

Ringkasan #

Property menyimpan data per object dengan tipe dan nilai default yang bisa dituliskan langsung, sementara method mendefinisikan perilaku yang mengolah data lewat $this. Method bisa menerima parameter dan mengembalikan nilai persis seperti function biasa, mengembalikan $this agar bisa dirantai, serta memakai self:: untuk mengakses konstanta class. Satu hal yang belum kita punya adalah cara menjamin object terisi data sejak diciptakan — tugas itu menjadi milik constructor, bintang pada Chapter berikutnya.

Referensi #