6-3: Variable Scope
Objectives
- Memahami global dan local scope
- Menggunakan global keyword
- Static variables
- Memahami superglobals
- Menghindari jebakan scope
Apa itu Scope?
Scope adalah "wilayah" di mana sebuah variabel bisa diakses. Di PHP, variabel yang dibuat di dalam function tidak bisa diakses dari luar function, dan sebaliknya — variabel di luar function tidak otomatis bisa diakses dari dalam function.
Scope ada untuk menjaga kerapian: function tidak akan "menabrak" variabel di luar, dan variabel di luar tidak berubah tanpa sengaja oleh function.
Local Scope
<?php
function test() {
$local = "I am local";
echo $local; // OK
}
// echo $local; // Error! $local tidak ada di sini
?>
Variabel yang dibuat di dalam function hanya hidup selama function itu berjalan. Setelah function selesai, variabelnya "mati" — kecuali static variable (dibahas di bawah).
Parameter Juga Local
<?php
function greet($name) {
// $name hanya ada di dalam function ini
echo "Halo, $name\n";
}
greet("Andi");
// echo $name; // Error! $name tidak ada di luar function
?>
Global Scope
<?php
$global = "I am global";
function test() {
// echo $global; // Error! Tidak bisa akses langsung
global $global;
echo $global; // OK - I am global
}
test();
// Atau gunakan $GLOBALS
function test2() {
echo $GLOBALS["global"]; // OK
}
?>
Dua cara mengakses variabel global dari dalam function:
| Cara | Contoh | Catatan |
|---|---|---|
Keyword global | global $nama; | Deklarasikan dulu di dalam function |
Array $GLOBALS | $GLOBALS["nama"] | Superglobal, selalu tersedia |
Mengubah Variabel Global
<?php
$score = 10;
function addPoint() {
global $score; // Harus pakai global untuk mengubah!
$score += 5;
}
addPoint();
echo $score . "\n"; // 15
// Tanpa global, function membuat variabel local baru
function addPointSalah() {
$score = 100; // Ini variabel BARU di local scope
}
addPointSalah();
echo $score . "\n"; // 15 (tidak berubah!)
?>
global dan $GLOBALS bekerja, tapi sebaiknya dihindari untuk kode yang kompleks. Function yang bergantung pada variabel global sulit diuji dan sulit diprediksi — nilainya bisa berubah dari mana saja. Best practice: kirim nilai lewat parameter, terima hasil lewat return.
Alternatif yang Lebih Baik: Parameter
<?php
// ❌ Gaya lama: global
$taxRate = 0.11;
function priceWithTaxGlobal($price) {
global $taxRate;
return $price * (1 + $taxRate);
}
// ✅ Lebih baik: lewat parameter
$taxRate = 0.11;
function priceWithTax($price, $rate) {
return $price * (1 + $rate);
}
echo priceWithTax(100000, $taxRate) . "\n"; // 111000
?>
Static Variable
<?php
function counter() {
static $count = 0;
$count++;
return $count;
}
echo counter(); // 1
echo counter(); // 2
echo counter(); // 3
?>
Static variable berbeda dari variabel local biasa:
| Aspek | Local biasa | Static |
|---|---|---|
| Inisialisasi | Setiap function dipanggil | Hanya sekali, saat pertama dipanggil |
| Nilai setelah function selesai | Hilang | Dipertahankan |
| Scope | Local saja | Local saja (tidak bisa diakses luar) |
Static di Dalam Loop
<?php
for ($i = 0; $i < 5; $i++) {
static $callCount = 0;
$callCount++;
echo "Call $i\n";
}
// ⚠️ Static dalam loop tricky - hanya initialize sekali
?>
Static variable berguna untuk counter (menghitung berapa kali function dipanggil) dan memoization (menyimpan hasil perhitungan agar tidak dihitung ulang — akan dibahas di materi 6-5).
Contoh Praktis: ID Otomatis
<?php
function nextId() {
static $id = 0;
$id++;
return "USER-" . str_pad($id, 4, "0", STR_PAD_LEFT);
}
echo nextId() . "\n"; // USER-0001
echo nextId() . "\n"; // USER-0002
echo nextId() . "\n"; // USER-0003
?>
Super Globals
Superglobals adalah variabel bawaan PHP yang bisa diakses di mana saja — di dalam maupun luar function, tanpa perlu keyword global.
<?php
// $_GET - URL parameters
// $_POST - Form data POST
// $_SERVER - Server information
// $_SESSION - Session data
// $_COOKIE - Cookies
// $_FILES - Uploaded files
// $_ENV - Environment variables
echo $_SERVER["HTTP_HOST"]; // localhost
echo $_SERVER["REQUEST_URI"]; // /path/to/file
?>
| Superglobal | Isi | Contoh penggunaan |
|---|---|---|
$_GET | Parameter URL | ?page=2 → $_GET["page"] |
$_POST | Data form method POST | Login, registrasi |
$_SERVER | Info server & request | User agent, method, IP |
$_SESSION | Data sesi antar request | Status login, keranjang |
$_COOKIE | Cookie browser | Preferensi pengguna |
$_FILES | File yang di-upload | Foto profil |
$_ENV | Environment variables | Kredensial, konfigurasi |
Contoh Penggunaan Superglobal
<?php
// Simulasi URL: index.php?page=about&lang=id
$page = $_GET["page"] ?? "home";
$lang = $_GET["lang"] ?? "id";
echo "Halaman: $page\n";
echo "Bahasa: $lang\n";
// Output (dengan URL di atas):
// Halaman: about
// Bahasa: id
// Cek method request
if ($_SERVER["REQUEST_METHOD"] === "POST") {
echo "Ini request POST\n";
} else {
echo "Ini request GET\n";
}
?>
Perhatikan penggunaan ?? (null coalescing operator) — ini memberi nilai default jika key tidak ada, sehingga kode tidak error saat parameter URL tidak dikirim.
Common Mistakes
Mengira Variabel Global Otomatis Terlihat
<?php
$name = "Andi";
function sayHello() {
// ❌ Salah: $name tidak terlihat di sini!
// echo "Halo, $name"; // Undefined variable warning
// ✅ Benar: deklarasikan dengan global
global $name;
echo "Halo, $name\n";
}
sayHello();
?>
Ini adalah kesalahan paling umum untuk pemula: variabel di luar function tidak otomatis tersedia di dalam function. PHP akan memberi warning "Undefined variable" dan nilainya null.
Mengubah Global Tanpa Sadar (By Reference)
<?php
$cart = ["Apel", "Jeruk"];
function addItem($cartList, $item) {
$cartList[] = $item; // Hanya mengubah salinan
return $cartList;
}
$cart = addItem($cart, "Mangga");
print_r($cart);
// Output: Array ( [0] => Apel [1] => Jeruk [2] => Mangga )
?>
Di contoh ini, function mengembalikan array baru dan pemanggil yang menugaskannya kembali ke $cart. Ini pola yang bersih — function tidak mengubah global secara diam-diam.
Static vs Global Tertukar
<?php
// Static: nilai dipertahankan antar pemanggilan, tapi tetap local
function hitung() {
static $n = 0;
$n++;
return $n;
}
echo hitung() . " " . hitung() . " " . hitung() . "\n";
// Output: 1 2 3
// Global: bisa diakses & diubah dari luar
$total = 0;
function tambahGlobal($x) {
global $total;
$total += $x;
}
tambahGlobal(5);
tambahGlobal(3);
echo $total . "\n"; // 8
?>
Pro Tips
- Hindari
globaldan$GLOBALS— kirim nilai via parameter, terima hasil via return. - Gunakan static untuk state kecil antar pemanggilan (counter, memoization).
- Superglobals aman dipakai di mana saja — tidak perlu
global. - Selalu beri nilai default saat membaca superglobals:
$_GET["x"] ?? "default". - Variabel local lebih aman — function tidak saling mengganggu.
Exercise
- Buat function yang count berapa kali dipanggil
- Jelaskan perbedaan global dan static variable
- Kapan sebaiknya gunakan $GLOBALS vs global keyword?
- Buat function
resetCounter()danhitungMundur()menggunakan static variable — pertama counter naik, lalu turun - Perbaiki kode berikut agar
$namabisa diakses di dalam function:
<?php
$nama = "Budi";
function sapa() {
echo "Halo, $nama";
}
sapa();
?>
- Buat function
hitungKata($kalimat)yang mengembalikan jumlah kata, lalu panggil dengan 3 kalimat berbeda
Summary
| Poin | Penjelasan |
|---|---|
| Local scope | Variabel hanya ada di dalam function |
| Global scope | Variabel di luar function; butuh global untuk akses |
$GLOBALS | Array superglobal berisi semua variabel global |
| Static variable | Nilai dipertahankan antar pemanggilan function |
| Superglobals | $_GET, $_POST, $_SERVER, dst — akses di mana saja |
| Best practice | Prefer parameter + return daripada global |
| Common mistake | Mengira variabel global terlihat otomatis di function |
Klik tombol ini setelah menyelesaikan materi
Quiz Bab 6
Uji pemahamanmu tentang Function