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:

SuperglobalIsiKapan terisi
$_GETParameter dari query string URLSaat halaman diakses lewat web dengan ?kunci=nilai
$_POSTData dari form dengan method POSTSaat form dikirim ke server
$_COOKIECookie yang dikirim browserSaat request membawa header Cookie
$_REQUESTGabungan $_GET + $_POST + $_COOKIEMengikuti ketiganya
$_SERVERInformasi server dan eksekusiSelalu, termasuk di CLI
$_FILESMetadata berkas hasil unggahanSaat form dengan enctype="multipart/form-data" dikirim
$_SESSIONData session penggunaSetelah session_start() dipanggil
$_ENVVariabel lingkungan prosesSaat 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
<?php
var_dump($_GET, $_POST, $_COOKIE, $_FILES);
var_dump(isset($_SESSION));

Output yang Dihasilkan:

text
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
<?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:

text
string(11) "Halo, Budi!"
string(11) "Halo, tamu!"

Mari kita bedah dua keputusan penting dalam fungsi tersebut:

  1. Baris 3 ($query['nama'] ?? 'tamu'): operator ?? menyediakan nilai cadangan ketika kunci tidak ada, sehingga tidak pernah muncul Warning: Undefined array key untuk pengunjung tanpa parameter.
  2. 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
<?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
<?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:

text
SAPI: cli
REQUEST_METHOD: (tidak tersedia di CLI)
argc: 1

Konstanta 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:

bash
php info-server.php Budi Siti

Output yang Dihasilkan:

text
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 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
<?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:

text
array(2) {
  [0]=>
  string(4) "kopi"
  [1]=>
  string(4) "gula"
}
string(4) "Budi"

Mari kita telaah urutannya:

  1. 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 mendahului session_start() dan sebelum keluaran apa pun tercetak.
  2. Baris 3 (session_start()): membuka (atau melanjutkan) session dan menyediakan array $_SESSION.
  3. Baris 5-6: data tinggal ditulis ke $_SESSION seperti array biasa; pada request berikutnya dengan session id yang sama, nilai ini tersedia kembali.
  4. 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
<?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
<?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";