Sejauh ini nama variabel selalu kita tulis secara harfiah di dalam kode: $harga, $nama, $stok. Kadang-kadang nama yang tepat baru diketahui saat program berjalan — misalnya ketika loop memproses daftar nama kolom, atau ketika konfigurasi datang sebagai pasangan kunci-nilai. PHP menyediakan dynamic variables (dikenal juga sebagai variable variables) untuk kebutuhan semacam itu. Chapter ini membedah cara kerjanya, bentuk kurung kurawal untuk ekspresi, pola pemakaian yang wajar di dunia nyata, serta bahaya besar yang muncul bila nama variabel diambil dari masukan pengguna.

Nama Variabel yang Dihitung saat Runtime #

Tanda dolar ganda $$ membaca isi sebuah variabel, lalu menggunakan isi tersebut sebagai nama variabel lain yang mau diakses. Jika $nama berisi string "harga", maka $$nama sama artinya dengan $harga:

php
<?php
$nama = "harga";
$$nama = 15000;

echo "harga: $harga\n";
var_dump($$nama);

Output yang Dihasilkan:

text
harga: 15000
int(15000)

Mari kita telaah kode di atas:

  1. Baris 2 ($nama = "harga";): variabel $nama diberi nilai string "harga" — sejauh ini belum ada yang istimewa.
  2. Baris 3 ($$nama = 15000;): interpreter membaca isi $nama (yaitu "harga"), lalu menjadikan string itu sebagai nama variabel tujuan penugasan — akibatnya variabel $harga tercipta dan terisi 150000.
  3. Baris 5 (echo "harga: $harga\n";): variabel $harga kini bisa dibaca seperti variabel biasa, karena memang variabel tersebut benar-benar ada di symbol table.
  4. Baris 6 (var_dump($$nama);): bentuk $$nama juga sah untuk membaca — interpreter kembali membongkar isi $nama lalu membaca $harga, sehingga yang tercetak adalah int(15000).

Mekanisme ini berlaku dua arah: $$nama bisa menjadi tujuan penugasan maupun sumber pembacaan. Konstruksi isset($$nama) dan unset($$nama) juga bekerja seperti pada variabel biasa — keduanya memeriksa atau menghapus variabel yang namanya diambil dari isi $nama.

Bentuk Kurung Kurawal untuk Ekspresi #

Nama variabel sering perlu dirangkai dulu sebelum dipakai — misalnya digabung dari kunci dan akhiran. Untuk itu PHP menyediakan bentuk ${ekspresi} yang mengevaluasi ekspresi di dalam kurung kurawal terlebih dahulu:

php
<?php
$kunci = "nama";
$suffix = "Depan";

${$kunci . $suffix} = "Siti";
echo "namaDepan: $namaDepan\n";

Output yang Dihasilkan:

text
namaDepan: Siti

Ekspresi $kunci . $suffix menghasilkan string "namaDepan", lalu penugasan menargetkan variabel bernama $namaDepan — terbukti dari baris echo yang membacanya langsung. Tanpa kurung kurawal, $$kunci . $suffix akan menimbulkan keambiguan: apakah akhiran ditempelkan ke nama variabel hasil, atau ke nilainya? Bentuk ${...} memastikan yang dirangkai adalah nama-nya.

Pola Nyata: Config Map #

Penggunaan yang paling sering dijumpai adalah mengubah array konfigurasi menjadi kumpulan variabel — pola yang populer pada framework dan template engine generasi lama:

php
<?php
$konfigurasi = [
    'db_host' => 'localhost',
    'db_user' => 'budi',
    'db_name' => 'toko',
];

foreach ($konfigurasi as $kunci => $nilai) {
    $$kunci = $nilai;
}

echo "$db_host / $db_user / $db_name\n";

Output yang Dihasilkan:

text
localhost / budi / toko

Loop foreach berjalan tiga kali, dan pada setiap putaran $$kunci menargetkan variabel bernama sesuai isi $kunci: $db_host, $db_user, dan $db_name. Setelah loop selesai, ketiga variabel tersebut terisi nilai dari array konfigurasi. Kebalikannya juga berguna: bila kita punya daftar nama kolom, loop serupa bisa membaca banyak variabel sekaligus lewat $$nama.

Perlu disampaikan secara jujur bahwa kode modern semakin jarang memakai pola ini. Array itu sendiri sudah merupakan wadah yang baik — $konfigurasi['db_host'] sama informatifnya dengan $db_host, tanpa menciptakan variabel global baru yang tak terlihat di daftar argumen maupun di alat bantu editor. Sepupu pola ini yang masih sangat hidup adalah pemanggilan dinamis: $fungsi() memanggil fungsi yang namanya tersimpan di $fungsi, dan new $kelas() membuat object dari class yang namanya dihitung saat runtime — keduanya akan kita bahas pada Section Fungsi dan Object-Oriented Programming.

Bahaya Nama Variabel dari Masukan Pengguna #

Masalah besar muncul ketika nama variabel diambil dari data yang tidak kita kendalikan. Perhatikan simulasi berikut, lalu bayangkan $masukan berasal dari $_GET alih-alih hard-coded:

php
<?php
// Simulasi masukan pengguna yang tidak divalidasi.
$masukan = "saldo";

// Saldo asli milik program.
$saldo = 500000;

// Nama variabel diambil mentah dari masukan pengguna.
$$masukan = 0;

echo "saldo: $saldo\n";

Output yang Dihasilkan:

text
saldo: 0

Satu baris $$masukan = 0; cukup untuk menimpa variabel $saldo milik program — dan pembaca kode tidak akan menemukan penugasan $saldo di mana pun karena penugasannya terjadi lewat nama tak terduga. Pola seperti inilah yang dulu membuat fitur register_globals menjadi sumber lubang keamanan klasik pada PHP lama: penyerang bisa “menciptakan” variabel apa pun cukup dengan mengirim parameter pada URL.

Alternatif yang aman memakai array sebagai batas wilayah data:

php
<?php
$masukan = "saldo";
$saldo = 500000;

// Alternatif aman: kunci array, bukan nama variabel.
$data = [];
$data[$masukan] = 0;

echo "saldo: $saldo\n";
var_dump($data);

Output yang Dihasilkan:

text
saldo: 500000
array(1) {
  ["saldo"]=>
  int(0)
}

Nilai dari masukan pengguna kini hanya menjadi kunci di dalam $data — variabel program tidak tersentuh, saldo tetap 500000, dan seluruh data eksternal terkumpul di satu tempat yang mudah diperiksa. Bila Anda menemukan kode lama yang memakai $$ pada data eksternal, migrasikan ke pola array seperti ini.

Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh Chapter ini dalam satu program yang dapat langsung Anda jalankan.

Ringkasan #

Dynamic variables membuat nama variabel dapat dihitung saat runtime: $$nama mengakses variabel yang namanya adalah isi $nama, dan ${ekspresi} merangkai nama dari ekspresi apa pun. Pola config map adalah penggunaan yang paling dikenal, meskipun kode modern lebih menyukai array sebagai wadah data dinamis. Nama variabel dari masukan pengguna adalah wilayah terlarang karena mampu menimpa variabel program secara diam-diam. Kini kita telah mengenal seluruh sisi penamaan nilai — berikutnya kita membahas bagaimana PHP memperlakukan tipe nilai yang berpindah masuk-keluar fungsi lewat mode strict types.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?php

// contoh.php — rangkuman Chapter Dynamic Variables.
// Jalankan dengan: php contoh.php

// Variable variables dasar.
$nama = "harga";
$$nama = 15000;
echo "harga: $harga\n";
var_dump($$nama);

// Kurung kurawal untuk ekspresi sebagai nama variabel.
$kunci = "nama";
$suffix = "Depan";
${$kunci . $suffix} = "Siti";
echo "namaDepan: $namaDepan\n";

// Pola config map: kunci array menjadi nama variabel.
$konfigurasi = [
    'db_host' => 'localhost',
    'db_user' => 'budi',
    'db_name' => 'toko',
];
foreach ($konfigurasi as $kunci => $nilai) {
    $$kunci = $nilai;
}
echo "$db_host / $db_user / $db_name\n";

// Jangan pernah memakai masukan pengguna sebagai nama variabel.
$masukan = 'saldo';
$$masukan = 'dipalsukan';
echo "saldo: $saldo\n";