Superglobal adalah variabel bawaan PHP yang tersedia di semua lingkup tanpa perlu kata kunci global, dan isinya berupa array asosiatif yang diisi PHP sebelum skrip dijalankan. Empat superglobal yang paling sering dipakai adalah $_GET, $_POST, $_SERVER, dan $_SESSION. Topik ini membahas sumber data masing-masing variabel, cara membacanya dengan aman, serta mekanisme session yang menyimpan data antar-permintaan. Setelah menyelesaikan topik ini, aliran data dari permintaan HTTP ke dalam skrip PHP dapat dilacak dengan jelas.
Variabel yang tersedia di mana saja#
Variabel biasa yang dibuat di dalam fungsi tidak terlihat dari luar lingkungannya, sebagaimana dibahas pada topik tentang lingkup fungsi. Superglobal tidak terikat aturan tersebut karena PHP mengisinya sejak awal eksekusi dan membuatnya dapat diakses dari fungsi mana pun tanpa persiapan. Isinya selalu berupa array asosiatif yang kuncinya berupa string, misalnya $_GET['kata'].
Empat superglobal berikut menjadi fokus topik ini beserta sumber datanya.
| Variabel | Sumber datanya |
|---|---|
$_GET | Parameter pada query string URL |
$_POST | Isi body permintaan POST, umumnya data form HTML |
$_SERVER | Informasi server dan permintaan, misalnya metode HTTP |
$_SESSION | Data sesi yang tersimpan di server antar-permintaan |
Superglobal lain seperti $_COOKIE, $_FILES, dan $_ENV juga tersedia, tetapi pola pembacaannya sama dengan keempatnya, yaitu mengambil nilai lewat nama kunci. Karena nilainya berasal dari luar program, setiap nilai superglobal harus diperlakukan sebagai data yang belum terpercaya sebelum dipakai lebih lanjut.
Membaca $_GET dan $_POST#
Pada konteks web, query string di akhir URL menjadi isi $_GET, sedangkan body permintaan POST dari sebuah form HTML menjadi isi $_POST. URL index.php?kata=sejarah&halaman=2 mengisi $_GET['kata'] dengan sejarah dan $_GET['halaman'] dengan 2. PHP CLI tidak menerima permintaan HTTP apa pun, sehingga kedua array itu dibiarkan kosong, dan contoh latihan di CLI mengisinya secara manual agar perilakunya dapat diperiksa.
<?php
// PHP CLI tidak mengisi $_GET, sehingga nilai diisi manual untuk latihan
$_GET['kata'] = 'sejarah';
$_GET['halaman'] = '2';
$kata = $_GET['kata'] ?? '';
$halaman = (int) ($_GET['halaman'] ?? 1);
echo 'Kata kunci : ' . $kata . PHP_EOL;
echo 'Halaman : ' . $halaman . PHP_EOL;
echo 'Tipe nilai : ' . get_debug_type($_GET['halaman']) . PHP_EOL;Kata kunci : sejarah
Halaman : 2
Tipe nilai : stringOperator ?? memberi nilai bawaan apabila kunci yang dibaca tidak ada, sehingga skrip tetap berjalan ketika parameter itu tidak dikirim. Baris ketiga keluaran menegaskan bahwa isi $_GET['halaman'] tetap bertipe string meskipun tertulis angka, sehingga konversi dengan (int) diperlukan sebelum nilainya dipakai dalam perhitungan.
<?php
$_GET['kata'] = 'sejarah';
echo ($_GET['kata'] ?? '(kosong)') . PHP_EOL;
echo ($_GET['urutan'] ?? '(kosong)') . PHP_EOL;
var_dump(isset($_GET['kata']));
var_dump(isset($_GET['urutan']));sejarah
(kosong)
bool(true)
bool(false)Kunci kata baru saja diisi sehingga nilai aslinya terbaca, sedangkan kunci urutan tidak pernah ada dan menghasilkan nilai bawaan (kosong). Fungsi isset mengembalikan true untuk kunci yang ada dan false untuk yang tidak ada, sehingga keduanya dapat dipisahkan sebelum program melanjutkan.
Mengenal $_SERVER#
Superglobal $_SERVER menghimpun informasi tentang server dan permintaan yang sedang berjalan. Beberapa kunci yang sering dibaca adalah REQUEST_METHOD yang berisi metode HTTP seperti GET atau POST, QUERY_STRING yang berisi query string mentah, HTTP_USER_AGENT yang berisi identitas browser, dan REMOTE_ADDR yang berisi alamat IP pengirim. Tidak semua kunci terisi pada setiap lingkungan, dan PHP CLI hanya mengisi sebagian kecilnya, sehingga pembacaan dengan ?? tetap dianjurkan.
<?php
// Nilai $_SERVER diisi manual agar contoh dapat direproduksi di CLI
$_SERVER['REQUEST_METHOD'] = 'GET';
$_SERVER['QUERY_STRING'] = 'kata=sejarah&halaman=2';
echo $_SERVER['REQUEST_METHOD'] . PHP_EOL;
echo $_SERVER['QUERY_STRING'] . PHP_EOL;
echo ($_SERVER['HTTP_USER_AGENT'] ?? '(tidak ada)') . PHP_EOL;GET
kata=sejarah&halaman=2
(tidak ada)Nilai QUERY_STRING adalah bentuk mentah sebelum PHP mengurainya menjadi $_GET, sehingga keduanya memuat informasi yang sama dalam susunan yang berbeda. Kunci HTTP_USER_AGENT tidak diisi pada contoh ini, dan pembacaan dengan ?? menghasilkan teks (tidak ada) tanpa warning apa pun.
Daftar kunci $_SERVER tidak tetap untuk semua lingkungan karena isinya bergantung pada server web yang menjalankan PHP. Hanya sedikit kunci yang aman diasumsikan selalu terisi, sehingga pola pembacaan dengan ?? beserta nilai bawaan diterapkan pada seluruh kuncinya. Menampilkan isi lengkap $_SERVER ke halaman juga perlu dihindari karena memuat rincian lingkungan server yang tidak perlu diketahui pengunjung.
Menyimpan data dengan $_SESSION#
PHP mengosongkan seluruh variabel skrip setiap kali satu permintaan selesai, sehingga data yang perlu bertahan antar-permintaan harus disimpan di tempat lain. Session menyediakan tempat itu, yaitu penyimpanan di sisi server yang dikaitkan dengan satu pengunjung melalui pengenal berupa cookie. Fungsi session_start membuka sesi dan mengisi $_SESSION, sedangkan fungsi session_write_close menyimpan isinya dan menutup sesi.
<?php
session_start();
$_SESSION['anggota'] = 'Dewi';
$_SESSION['kunjungan'] = ($_SESSION['kunjungan'] ?? 0) + 1;
echo $_SESSION['anggota'] . ' tercatat kunjungan ke-' . $_SESSION['kunjungan'] . PHP_EOL;
session_write_close();Dewi tercatat kunjungan ke-1Pada konteks web, browser mengirim kembali cookie pengenal sesi pada setiap kunjungan, sehingga $_SESSION yang dibuka oleh session_start berisi data kunjungan-kunjungan sebelumnya dan penghitungnya terus bertambah. Eksekusi di CLI tidak membawa cookie pengenal, sehingga setiap kali dijalankan sesi baru terbentuk dan penghitung selalu dimulai dari satu.
Isi $_SESSION baru tersimpan ketika sesi ditutup melalui session_write_close atau ketika permintaan selesai, sehingga perubahan setelah titik itu tidak tercatat. Mengosongkan satu kunci dilakukan dengan unset, sedangkan menghapus data sesi di server dilakukan dengan session_destroy. Penyimpanan ini cocok untuk status login pengguna dan preferensi tampilan, bukan untuk data yang besar dan hanya dipakai sekali.
Kesalahan umum#
Empat kesalahan berikut paling sering muncul saat membaca superglobals.
- Kunci superglobal diakses langsung tanpa pemeriksaan keberadaannya. Parameter yang tidak dikirim memicu warning dan bernilai null, sehingga kode setelahnya berjalan dengan nilai yang salah. Perbaikannya adalah membaca dengan
??atau memeriksa denganissetterlebih dahulu. - Isi superglobal dipercaya begitu saja karena dianggap berasal dari kode sendiri. Nilai tersebut datang dari luar program, yaitu dari URL atau body permintaan, dan dapat berisi apa pun. Perbaikannya adalah memvalidasi dan mengonversi setiap nilai sebelum dipakai.
- Data yang tidak boleh terlihat dikirim melalui
$_GET. Query string muncul di alamat URL, riwayat browser, dan log server, sehingga isinya mudah terbaca. Perbaikannya adalah mengirim data tersebut melalui permintaan POST agar isinya berada di body permintaan. - Data yang perlu bertahan antar-permintaan disimpan ke variabel biasa. Seluruh variabel skrip dibersihkan setelah permintaan selesai, sehingga datanya hilang pada kunjungan berikutnya. Perbaikannya adalah menyimpan data lintas permintaan ke
$_SESSIONsetelah sesi dibuka.
Ringkasan#
- Superglobal tersedia di semua lingkup karena PHP mengisinya sejak awal eksekusi, dan isinya berupa array asosiatif yang berasal dari luar program.
$_GETdiisi dari query string URL dan$_POSTdari body permintaan POST, sedangkan PHP CLI membiarkan keduanya kosong sehingga contoh CLI mengisinya secara manual.$_SERVERmenghimpun informasi server dan permintaan, termasukREQUEST_METHODdanQUERY_STRING, dengan kunci yang tidak selalu terisi di setiap lingkungan.$_SESSIONmenyimpan data antar-permintaan di sisi server setelahsession_startmembuka sesi, dan pengenalnya dibawa browser melalui cookie.
Referensi#
- Superglobals — PHP Manual — Penjelasan superglobal dan daftar variabel yang termasuk di dalamnya.
$_GET— PHP Manual — Dokumentasi variabel query string beserta contoh URL dan isinya.$_POST— PHP Manual — Dokumentasi variabel body permintaan POST.$_SERVER— PHP Manual — Daftar kunci informasi server dan permintaan.$_SESSION— PHP Manual — Dokumentasi variabel session dan pengelolaannya.- session_start — PHP Manual — Dokumentasi pembukaan session beserta opsinya.