Array mengelompokkan data, tetapi aplikasi nyata butuh lebih: data yang membawa perilaku — Pesanan yang tahu cara menghitung totalnya, Pengguna yang bisa mengganti sandinya. Tipe object adalah jawaban PHP untuk kebutuhan itu. Pada Chapter ini kita memandang object sebagai tipe data: cara membuatnya, wujud minimalnya bernama stdClass, konversi bolak-balik dengan array, dan satu sifat paling pentingnya — assignment object menyalin referensi, bukan isinya. Pemrograman berorientasi object secara penuh (visibility, inheritance, interface) menempati section tersendiri di akhir course.
Instance dari Sebuah Class #
Object selalu lahir dari cetakan bernama class: definisi yang menyimpan property (data) dan method (perilaku). Kata kunci new membuat satu instance — wujud hidup — dari cetakan tersebut:
<?php
class Point {
public int $x;
public int $y;
public function __construct(int $x, int $y) {
$this->x = $x;
$this->y = $y;
}
}
$titik = new Point(3, 7);
var_dump($titik);
var_dump(is_object($titik), gettype($titik));Output yang Dihasilkan:
object(Point)#1 (2) {
["x"]=>
int(3)
["y"]=>
int(7)
}
bool(true)
string(6) "object"Mari kita bedah potongan di atas dengan lensa tipe data, bukan OOP: class Point mendefinisikan dua property bertipe int; fungsi khusus __construct() berjalan otomatis setiap kali new Point(...) dipanggil untuk mengisi property itu. Hasil var_dump() menampilkan object(Point)#1 (2) — nama class, nomor instance (#1, penomoran internal PHP), dan jumlah property — diikuti daftar property-nya. Pemeriksaan tipenya memakai is_object() dan gettype() yang mengembalikan "object".
stdClass dan Casting Array ke Object #
PHP menyediakan class kosong siap pakai bernama stdClass — kantong property tanpa definisi apa pun. Cara tercepat mendapatkannya adalah meng-cast array menjadi object:
<?php
$profilArray = ["nama" => "Budi", "umur" => 25];
$profil = (object)$profilArray;
var_dump($profil);
var_dump($profil->nama, $profil->umur);
$kembali = (array)$profil;
var_dump($kembali);Output yang Dihasilkan:
object(stdClass)#1 (2) {
["nama"]=>
string(4) "Budi"
["umur"]=>
int(25)
}
string(4) "Budi"
int(25)
array(2) {
["nama"]=>
string(4) "Budi"
["umur"]=>
int(25)
}Cast (object) membungkus setiap pasangan key-nilai array menjadi property object stdClass, dan cast (array) mengembalikannya menjadi array — bolak-balik tanpa kehilangan data. Akses property memakai tanda panah: $profil->nama adalah padanan $profilArray["nama"]. stdClass juga menerima property baru yang dibuat langsung:
<?php
$tugas = new stdClass();
$tugas->judul = "Belajar PHP";
$tugas->selesai = false;
var_dump($tugas);Output yang Dihasilkan:
object(stdClass)#1 (2) {
["judul"]=>
string(11) "Belajar PHP"
["selesai"]=>
bool(false)
}Object $tugas lahir kosong lalu diisi dua property on-the-fly. Kebiasaan membuat property dinamis seperti ini hanya nyaman di stdClass; untuk class buatan sendiri, PHP 8.2 menandainya Deprecated dan mendorong Anda mendeklarasikan property secara eksplisit di definisi class.
Sama seperti array, membaca property yang tidak ada memicu Warning: Undefined property dengan nilai null. Operator ?? yang sudah kita kenal bekerja juga di sini:
<?php
$profil = (object)["nama" => "Budi"];
var_dump($profil->nama);
var_dump($profil->email ?? "belum diisi");Output yang Dihasilkan:
string(4) "Budi"
string(11) "belum diisi"Assignment Object Menyalin Referensi #
Inilah sifat object yang membedakannya dari semua tipe sebelumnya. Ketika variabel integer atau array di-assignment ke variabel lain, isinya disalin — dua variabel berdiri independen. Ketika variabel object di-assignment, yang disalin hanyalah penunjuk ke instance yang sama:
<?php
class Keranjang {
public int $jumlahItem = 0;
}
$keranjangA = new Keranjang();
$keranjangB = $keranjangA;
$keranjangB->jumlahItem = 5;
var_dump($keranjangA->jumlahItem);
var_dump($keranjangA === $keranjangB);Output yang Dihasilkan:
int(5)
bool(true)Perubahan lewat $keranjangB terlihat dari $keranjangA — keduanya menunjuk instance yang sama, seperti dua papan nama untuk satu rumah. Perbandingan $keranjangA === $keranjangB menghasilkan true justru karena identitasnya sama. Konsekuensi praktisnya besar: object yang dikirim ke function atau disimpan di array bisa diubah isinya dari mana saja yang memegang referensinya.
clone: Membuat Salinan Independen #
Ketika Anda benar-benar butuh salinan terpisah, kata kunci clone membuat instance baru dengan property yang dikopi dari aslinya:
<?php
class Keranjang {
public int $jumlahItem = 0;
}
$asli = new Keranjang();
$asli->jumlahItem = 5;
$salinan = clone $asli;
$salinan->jumlahItem = 99;
var_dump($asli->jumlahItem, $salinan->jumlahItem);
var_dump($asli === $salinan);Output yang Dihasilkan:
int(5)
int(99)
bool(false)Kali ini $asli tetap berisi 5 dan $salinan berisi 99 — dua instance berbeda, dibuktikan === yang menghasilkan false. Satu catatan penting: clone menyalin property secara dangkal (shallow copy). Property bertipe object tetap menunjuk instance yang sama di kedua salinan; menyalin seluruh isi bersarang butuh method khusus __clone() yang dibahas pada Chapter Cloning Objects
.
Object dalam Perbandingan dan Serialisasi #
Sebagai penutup sisi tipe: object selalu bernilai true dalam konteks boolean — bahkan stdClass tanpa property — sehingga pemeriksaan “kosong” harus dilakukan pada property-nya. Untuk mengintip isi object secara ringkas, json_encode() mengubah property public menjadi format JSON yang mudah dibaca:
<?php
$titik = (object)["x" => 3, "y" => 7];
var_dump((bool)$titik);
var_dump(json_encode($titik));Output yang Dihasilkan:
bool(true)
string(13) "{"x":3,"y":7}"Aturan perbandingan antar object (== membandingkan isi, === membandingkan instance yang sama) akan dibedah pada Chapter Object Comparison
— polanya sama dengan yang sudah kita lihat pada clone di atas.
Ringkasan #
Object adalah instance dari class: property-nya diakses dengan ->, tipe diperiksa dengan is_object(), dan stdClass menyediakan wadah generik yang bisa di-cast bolak-balik dengan array. Assignment variabel object hanya menyalin referensi ke instance yang sama, sehingga perubahan terlihat dari semua variabel penunjuknya; clone membuat salinan independen secara dangkal. Tipe built-in terakhir kita jauh lebih sunyi: resource — penunjuk ke dunia luar PHP.