Seiring program bertumbuh, kode Anda akan terbagi ke dalam puluhan fungsi, masing-masing dengan variabelnya sendiri. Pertanyaan penting pun muncul: variabel yang dibuat di satu tempat, di mana saja ia bisa dibaca? Jawabannya diatur oleh variable scope — wilayah program tempat sebuah nama variabel terlihat. Pemahaman scope mencegah dua kelas masalah sekaligus: fungsi yang gagal membaca data karena variabelnya tidak terlihat, dan bug senyap karena dua fungsi tanpa sengaja berbagi nama yang sama.
Scope Fungsi, Bukan Scope Blok #
PHP menerapkan scope pada tingkat fungsi, bukan tingkat blok seperti bahasa C atau Java. Artinya, variabel yang dibuat di dalam blok if atau badan loop tetap terlihat di luar blok tersebut, selama keduanya berada dalam fungsi yang sama. Perhatikan percobaan berikut (pernyataan if dan loop for akan kita bedah tuntas pada Section Control Flow — untuk sekarang cukup perhatikan di mana variabel hidup):
<?php
if (true) {
$diskon = 0.1;
}
echo "Diskon tetap terbaca: $diskon\n";
for ($i = 1; $i <= 3; $i++) {
$terakhir = $i;
}
echo "Nilai terakhir loop: $terakhir\n";Output yang Dihasilkan:
Diskon tetap terbaca: 0.1
Nilai terakhir loop: 3Variabel $diskon didefinisikan di dalam blok if, dan $terakhir di dalam loop, namun keduanya tetap terbaca setelah bloknya selesai. Penjelasannya: kurung kurawal milik if dan for tidak menciptakan scope baru — hanya pemanggilan fungsi yang menciptakannya. Konsekuensinya, semua variabel di top-level berkas berada dalam satu wilayah bernama global scope.
Variabel Global Tidak Terlihat di Dalam Fungsi #
Setiap pemanggilan fungsi mendapat symbol table sendiri — kamus nama-ke-nilai yang terpisah dari global scope. Variabel global karenanya tidak otomatis terlihat di dalam fungsi:
<?php
$pesan = "variabel global";
function tampilPesan(): void {
echo $pesan;
}
tampilPesan();Saat dijalankan, fungsi tampilPesan() mencetak peringatan Warning: Undefined variable $pesan beserta nama berkas dan nomor barisnya, lalu echo meneruskan string kosong. PHP tidak menganggap $pesan sebagai variabel global bernama sama — bagi fungsi tersebut, $pesan adalah nama lokal yang belum pernah diisi. Perilaku ini disengaja: bila semua variabel global otomatis terlihat di semua fungsi, satu penamaan yang bentrok bisa mengacaukan fungsi mana pun di berkas yang sama.
Kata Kunci global #
Ketika sebuah fungsi membutuhkan akses ke variabel global, PHP menyediakan keyword global untuk mengimpornya ke scope lokal:
<?php
$saldo = 100000;
function tarikDana(int $jumlah): int {
global $saldo;
$saldo -= $jumlah;
return $saldo;
}
echo tarikDana(25000), "\n";
echo "Saldo sekarang: $saldo\n";Output yang Dihasilkan:
75000
Saldo sekarang: 75000Mari kita telaah kode di atas:
- Baris 7 (
global $saldo;): pernyataan ini membuat nama$saldodi dalam fungsi menunjuk ke variabel global yang sama — bukan salinannya. - Baris 8 (
$saldo -= $jumlah;): karena menunjuk ke global, pengurangan benar-benar mengubah variabel global$saldomenjadi75000. - Baris 12-13: nilai kembali fungsi (
75000) dan pembacaan$saldodari global scope menghasilkan angka yang sama, membuktikan keduanya merujuk satu variabel.
Keyword global bisa mengimpor beberapa nama sekaligus (global $saldo, $kurs;), tetapi kekuatan ini sebaiknya dipakai hemat. Fungsi yang diam-diam mengubah keadaan global sulit diuji dan dipindah; cara yang lebih sehat adalah melewatkan nilai sebagai parameter dan mengembalikan hasilnya — pola yang akan kita latih tuntas pada Section Fungsi.
Array $GLOBALS #
Alternatif tanpa keyword global adalah superglobal $GLOBALS — array asosiatif yang berisi seluruh variabel global, dengan nama variabel sebagai kunci:
<?php
$saldo = 100000;
function tarikDana(int $jumlah): int {
$GLOBALS['saldo'] -= $jumlah;
return $GLOBALS['saldo'];
}
function lihatSaldo(): int {
return $GLOBALS['saldo'];
}
echo tarikDana(25000), "\n";
echo lihatSaldo(), "\n";
echo $saldo, "\n";Output yang Dihasilkan:
75000
75000
75000Ketiga baris keluaran sama-sama mencetak 75000 karena $GLOBALS['saldo'] dan $saldo di global scope adalah dua cara menulis variabel yang identik. Kekuatan ini juga punya sisi gelap: seperti sudah kita bahas pada Chapter Aturan Penamaan Variabel
, unset($GLOBALS['saldo']) menghapus variabel global tersebut, dan sejak PHP 8.1 $GLOBALS hanya boleh ditulis per elemen — penimpaan utuh seperti $GLOBALS = [] memicu galat fatal.
Static Variable dalam Fungsi #
Biasanya variabel lokal fungsi dilupakan begitu fungsi berakhir — dibuat ulang dari nol pada pemanggilan berikutnya. Keyword static mengubah perilaku ini: nilai variabel bertahan antar-pemanggilan:
<?php
function catatPanggilan(): int {
static $hitung = 0;
$hitung++;
return $hitung;
}
echo catatPanggilan(), " ", catatPanggilan(), " ", catatPanggilan(), "\n";
$hitung = 100;
echo "Global: $hitung\n";Output yang Dihasilkan:
1 2 3
Global: 100Mari kita bedah hasilnya:
- Baris 3 (
static $hitung = 0;): penugasan awal ini hanya dijalankan pada pemanggilan pertama; PHP menyimpan nilai$hitungdi memori yang tetap hidup selama program berjalan. - Baris 8: tiga pemanggilan berturut-turut menghasilkan
1 2 3— setiap panggilan menerima nilai peninggalan panggilan sebelumnya. - Baris 10-11: variabel
$hitungdi global scope sama sekali terpisah dari$hitungstatis di dalam fungsi, sehingga tetap bernilai100.
Pola ini pas untuk penghitung, cache kecil di dalam fungsi, atau memoization. Yang perlu diingat: static membuat fungsi menyimpan keadaan tersembunyi sehingga hasilnya bergantung pada riwayat pemanggilan — gunakan hanya bila kesederhanaannya jelas lebih berharga daripada kemurnian fungsi.
Batas include #
Statement include menempelkan kode berkas lain persis di titik pemanggilannya, dan scope yang berlaku adalah scope pemanggilnya. Berkas konfig-lokal.php di bundle chapter ini hanya berisi dua baris penugasan $judul dan $versi. Kita uji dua titik pemanggilan yang berbeda:
<?php
include 'konfig-lokal.php';
echo "Di scope global: $judul\n";
function muatKonfigurasi(): void {
include 'konfig-lokal.php';
echo "Di dalam fungsi: $judul\n";
}
muatKonfigurasi();
echo isset($versi) ? "versi: $versi\n" : "versi tidak terlihat dari sini\n";Output yang Dihasilkan:
Di scope global: Belajar PHP
Di dalam fungsi: Belajar PHP
versi: 8.4Pada pemanggilan pertama, include berjalan di global scope sehingga $judul menjadi variabel global. Pada pemanggilan di dalam muatKonfigurasi(), berkas yang sama dieksekusi namun penugasannya kini masuk ke scope lokal fungsi — itulah mengapa baris terakhir melaporkan $versi tidak terlihat dari global scope. Satu berkas konfigurasi bisa karenanya menghasilkan efek berbeda tergantung di mana ia di-include; pola yang lebih terkendali adalah membungkus konfigurasi sebagai fungsi yang mengembalikan array.
Ringkasan #
Scope PHP berpusat pada fungsi: blok tidak menciptakan wilayah baru, variabel global tidak otomatis terlihat di dalam fungsi, dan global serta $GLOBALS menjadi jembatan bila memang diperlukan. Static variable memberi fungsi memori antar-pemanggilan, sementara include mewarisi scope tempat ia dipanggil. Aturan-aturan ini menyisakan satu keluarga variabel istimewa yang terlihat di semua scope tanpa perlu impor — superglobals, bintang utama chapter berikutnya.
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 Variable Scope.
// Jalankan dengan: php contoh.php
$saldo = 100000;
function tarikDana(int $jumlah): int {
global $saldo;
$saldo -= $jumlah;
return $saldo;
}
function lihatSaldo(): int {
return $GLOBALS['saldo'];
}
echo tarikDana(25000), "\n";
echo lihatSaldo(), "\n";
echo $saldo, "\n";
// Static variable: nilai bertahan antar-pemanggilan fungsi.
function catatPanggilan(): int {
static $hitung = 0;
$hitung++;
return $hitung;
}
echo catatPanggilan(), " ", catatPanggilan(), " ", catatPanggilan(), "\n";
// Batas include: berkas yang di-include mewarisi scope pemanggilnya.
include 'konfig-lokal.php';
echo "Di scope global: $judul\n";
function muatKonfigurasi(): void {
include 'konfig-lokal.php';
echo "Di dalam fungsi: $judul\n";
}
muatKonfigurasi();
konfig-lokal.php
Unduh berkas<?php
// konfig-lokal.php — berkas konfigurasi sederhana untuk demo include.
$judul = "Belajar PHP";
$versi = "8.4";