Chapter Variable Scope
menutup dengan pertanyaan menarik: adakah variabel yang terlihat di semua scope tanpa perlu keyword global? Jawabannya ada, dan PHP menyediakan delapan sekaligus dalam satu keluarga bernama superglobals. Array istimewa ini — $_GET, $_POST, $_SERVER, dan lima saudaranya — menjadi pintu masuk data dari luar program: query string, form, berkas yang diunggah, sampai informasi lingkungan server. Karena selalu terisi otomatis oleh PHP, memahami isi dan cara membacanya dengan aman adalah keterampilan wajib sebelum kita menyentuh pemrograman web.
Delapan Superglobals #
Delapan variabel istimewa ini didefinisikan PHP di setiap scope, dari global scope sampai bagian terdalam fungsi. Berikut peta lengkapnya:
| Superglobal | Isi | Kapan terisi |
|---|---|---|
$_GET | Parameter dari query string URL | Saat halaman diakses lewat web dengan ?kunci=nilai |
$_POST | Data dari form dengan method POST | Saat form dikirim ke server |
$_COOKIE | Cookie yang dikirim browser | Saat request membawa header Cookie |
$_REQUEST | Gabungan $_GET + $_POST + $_COOKIE | Mengikuti ketiganya |
$_SERVER | Informasi server dan eksekusi | Selalu, termasuk di CLI |
$_FILES | Metadata berkas hasil unggahan | Saat form dengan enctype="multipart/form-data" dikirim |
$_SESSION | Data session pengguna | Setelah session_start() dipanggil |
$_ENV | Variabel lingkungan proses | Saat skrip dijalankan, tergantung konfigurasi variables_order |
Karena CLI tidak punya request HTTP, sebagian besar superglobal tersedia namun kosong. Kita bisa melihatnya langsung dengan var_dump():
<?php
var_dump($_GET, $_POST, $_COOKIE, $_FILES);
var_dump(isset($_SESSION));Output yang Dihasilkan:
array(0) {
}
array(0) {
}
array(0) {
}
array(0) {
}
bool(false)Empat superglobal pertama tercetak sebagai array(0) {} — array yang ada, hanya tidak berisi, karena tidak ada query string, form, cookie, maupun unggahan yang masuk lewat baris perintah. Hasil bool(false) pada baris terakhir membuktikan $_SESSION bahkan belum dibuat: array ini baru tersedia setelah kita memanggil session_start(), seperti yang akan kita coba pada bagian akhir pembahasan superglobal ini. Keadaan “array kosong” dan “belum ada” memang berbeda, dan membedakannya penting saat Anda menulis kode yang harus jalan di CLI maupun web.
Membaca $_GET Secara Aman #
Di lingkungan web, $_GET terisi dari query string: URL sapa.php?nama=Budi membuat PHP menyediakan $_GET['nama'] berisi string "Budi". Karena CLI tidak punya query string, kita menguji logika pembacaannya dengan handler murni — fungsi yang menerima array query sebagai parameter biasa, lalu diuji dengan superglobal tiruan:
<?php
function sapaPengunjung(array $query): string {
$nama = $query['nama'] ?? 'tamu';
return "Halo, " . htmlspecialchars($nama) . "!";
}
var_dump(sapaPengunjung(['nama' => 'Budi']));
var_dump(sapaPengunjung([]));Output yang Dihasilkan:
string(11) "Halo, Budi!"
string(11) "Halo, tamu!"Mari kita bedah dua keputusan penting dalam fungsi tersebut:
- Baris 3 (
$query['nama'] ?? 'tamu'): operator??menyediakan nilai cadangan ketika kunci tidak ada, sehingga tidak pernah munculWarning: Undefined array keyuntuk pengunjung tanpa parameter. - Baris 4 (
htmlspecialchars(...)): keluaran ini ditujukan untuk halaman HTML, jadi teks dari pengunjung dibersihkan dulu — tanpa ini, masukan<script>alert('xss')</script>akan dieksekusi browser sebagai kode. Kita akan bedah serang ini tuntas pada Section Web Security.
Pola handler seperti ini membuat kode bisa diuji dari CLI apa adanya. Versi siap-pakai di lingkungan web hanya mengganti parameter dengan superglobal sungguhan:
<?php
// sapa.php — akses lewat browser: http://localhost:8000/sapa.php?nama=Budi
$nama = $_GET['nama'] ?? 'tamu';
echo "Halo, " . htmlspecialchars($nama) . "!";Bila berkas di atas dijalankan lewat server bawaan php -S localhost:8000 (cara penggunaannya dibahas pada Chapter Built-in Web Server
) lalu dibuka dengan URL berakhiran ?nama=Budi, browser menampilkan Halo, Budi!. Dari CLI murni kode tersebut tetap aman dijalankan namun selalu memakai nilai cadangan 'tamu' karena $_GET kosong — itulah mengapa demo utama chapter ini memakai handler tiruan yang bisa diverifikasi penuh.
$_SERVER di CLI #
Array $_SERVER menyimpan informasi eksekusi: nama skrip, argumen baris perintah, hingga detail request HTTP. Sebagian kuncinya memang terisi di CLI, dan justru kunci-kunci itulah yang bisa kita uji langsung:
<?php
echo "SAPI: ", PHP_SAPI, "\n";
echo "REQUEST_METHOD: ", $_SERVER['REQUEST_METHOD'] ?? "(tidak tersedia di CLI)", "\n";
echo "argc: ", $_SERVER['argc'], "\n";Output yang Dihasilkan:
SAPI: cli
REQUEST_METHOD: (tidak tersedia di CLI)
argc: 1Konstanta PHP_SAPI bernilai "cli" karena skrip berjalan lewat antarmuka baris perintah — pada PHP-FPM nilainya "fpm-fcgi", dan inilah cara standar membedakan lingkungan eksekusi. Kunci REQUEST_METHOD hanya terisi oleh server web, sehingga di CLI operator ?? mengambil nilai cadangan. Kunci argc berisi jumlah argumen baris perintah termasuk nama skripnya sendiri. Untuk melihat daftar argumen di $_SERVER['argv'], kita pakai berkas demo dari bundle chapter ini:
php info-server.php Budi SitiOutput yang Dihasilkan:
PHP_SAPI: cli
PHP_SELF: info-server.php
SCRIPT_NAME: info-server.php
argc: 3
argv:
[0] info-server.php
[1] Budi
[2] Siti
REQUEST_METHOD: (tidak tersedia di CLI)Argumen Budi dan Siti yang kita ketik setelah nama berkas muncul sebagai argv[1] dan argv[2], sementara argv[0] selalu berisi nama skrip — persis perilaku $argv yang kita coba pada Chapter Memahami PHP CLI
, karena $argv dan $_SERVER['argv'] merujuk data yang sama. Di lingkungan web, $_SERVER justru dipenuhi kunci seperti HTTP_HOST, HTTP_USER_AGENT, dan REQUEST_URI yang menjelaskan request browser; nilainya berbeda-beda tergantung pengunjung sehingga cukup digambarkan di sini, bukan dicetak sebagai contoh keluaran.
$_SESSION dan $_COOKIE di CLI #
Session adalah mekanisme mengingat data pengguna antar-request: data disimpan di server dengan pengenal unik, dan browser menyimpan pengenal tersebut dalam cookie. Di CLI keduanya tetap bisa dicoba karena session bekerja tanpa browser — kita hanya perlu memanggil session_start() dan, khusus untuk demo ini, menetapkan session id agar keluarannya konsisten:
<?php
session_id('kursus-php-demo');
session_start();
$_SESSION['keranjang'] = ['kopi', 'gula'];
$_SESSION['pengunjung'] = 'Budi';
var_dump($_SESSION['keranjang'], $_SESSION['pengunjung']);
session_destroy();Output yang Dihasilkan:
array(2) {
[0]=>
string(4) "kopi"
[1]=>
string(4) "gula"
}
string(4) "Budi"Mari kita telaah urutannya:
- Baris 2 (
session_id('kursus-php-demo')): menetapkan pengenal session secara manual. Tanpa baris ini, PHP membuat pengenal acak baru pada tiap eksekusi — cocok untuk produksi, buruk untuk contoh buku yang ingin keluaran konsisten. Panggilan ini harus mendahuluisession_start()dan sebelum keluaran apa pun tercetak. - Baris 3 (
session_start()): membuka (atau melanjutkan) session dan menyediakan array$_SESSION. - Baris 5-6: data tinggal ditulis ke
$_SESSIONseperti array biasa; pada request berikutnya dengan session id yang sama, nilai ini tersedia kembali. - Baris 9 (
session_destroy()): menghapus data session di server — di sini sekaligus membuat demo bisa diulang dengan hasil identik.
Cookie ($_COOKIE) menyimpan data kecil di sisi browser dan dikirim balik pada setiap request; di CLI array ini kosong karena tidak ada browser yang mengirimkannya. Mekanisme lengkap session dan cookie — transaksi, keamanan, hingga session fixation — mendapat section khususnya sendiri pada HTTP State: Sessions dan Cookies
.
Ringkasan #
Delapan superglobals adalah jendela PHP ke dunia luar: $_GET dan $_POST membawa masukan pengguna, $_SERVER melaporkan lingkungan eksekusi, $_SESSION mengingat data antar-request, dan seluruhnya terlihat di semua scope. Di CLI sebagian array itu kosong, sehingga handler murni dengan superglobal tiruan menjadi cara menguji logika secara deterministik. Ada satu topik scope yang belum tersentuh: mengapa dua nama variabel bisa menunjuk nilai yang sama. Chapter berikutnya membedah variable references.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
// contoh.php — rangkuman Chapter Superglobals.
// Jalankan dengan: php contoh.php
// $_SESSION dengan session id tetap agar keluaran konsisten.
// session_id() + session_start() harus dipanggil sebelum ada keluaran apa pun.
session_id('kursus-php-demo');
session_start();
$_SESSION['keranjang'] = ['kopi', 'gula'];
var_dump($_SESSION['keranjang']);
session_destroy();
// Di CLI, sebagian superglobal tersedia sebagai array kosong.
var_dump($_GET, $_POST, $_COOKIE);
// Handler murni: superglobal tiruan diteruskan sebagai parameter biasa.
function sapaPengunjung(array $query): string {
$nama = $query['nama'] ?? 'tamu';
return "Halo, " . htmlspecialchars($nama) . "!";
}
var_dump(sapaPengunjung(['nama' => 'Budi']));
var_dump(sapaPengunjung([]));
info-server.php
Unduh berkas<?php
// info-server.php — periksa kunci $_SERVER yang tersedia saat dijalankan dari CLI.
// Jalankan dengan: php info-server.php Budi Siti
echo "PHP_SAPI: ", PHP_SAPI, "\n";
echo "PHP_SELF: ", $_SERVER['PHP_SELF'], "\n";
echo "SCRIPT_NAME: ", $_SERVER['SCRIPT_NAME'], "\n";
echo "argc: ", $_SERVER['argc'], "\n";
echo "argv:\n";
foreach ($_SERVER['argv'] as $index => $argumen) {
echo " [$index] $argumen\n";
}
echo "REQUEST_METHOD: ", $_SERVER['REQUEST_METHOD'] ?? "(tidak tersedia di CLI)", "\n";