BAB 6: FUNCTION

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.

📊 Memuat diagram…

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

CaraContohCatatan
Keyword globalglobal $nama;Deklarasikan dulu di dalam function
Array $GLOBALS$GLOBALS["nama"]Superglobal, selalu tersedia

Mengubah Variabel Global

php
<?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!)

?>
⚠️Perhatian

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

AspekLocal biasaStatic
InisialisasiSetiap function dipanggilHanya sekali, saat pertama dipanggil
Nilai setelah function selesaiHilangDipertahankan
ScopeLocal sajaLocal saja (tidak bisa diakses luar)

Static di Dalam Loop

php
<?php

for ($i = 0; $i < 5; $i++) {
    static $callCount = 0;
    $callCount++;
    echo "Call $i\n";
}
// ⚠️ Static dalam loop tricky - hanya initialize sekali

?>
💡Tip

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

?>
SuperglobalIsiContoh penggunaan
$_GETParameter URL?page=2$_GET["page"]
$_POSTData form method POSTLogin, registrasi
$_SERVERInfo server & requestUser agent, method, IP
$_SESSIONData sesi antar requestStatus login, keranjang
$_COOKIECookie browserPreferensi pengguna
$_FILESFile yang di-uploadFoto profil
$_ENVEnvironment variablesKredensial, konfigurasi

Contoh Penggunaan Superglobal

php
<?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";
}

?>
💡Tip

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

  1. Hindari global dan $GLOBALS — kirim nilai via parameter, terima hasil via return.
  2. Gunakan static untuk state kecil antar pemanggilan (counter, memoization).
  3. Superglobals aman dipakai di mana saja — tidak perlu global.
  4. Selalu beri nilai default saat membaca superglobals: $_GET["x"] ?? "default".
  5. Variabel local lebih aman — function tidak saling mengganggu.

Exercise

  1. Buat function yang count berapa kali dipanggil
  2. Jelaskan perbedaan global dan static variable
  3. Kapan sebaiknya gunakan $GLOBALS vs global keyword?
  4. Buat function resetCounter() dan hitungMundur() menggunakan static variable — pertama counter naik, lalu turun
  5. Perbaiki kode berikut agar $nama bisa diakses di dalam function:
php
<?php
$nama = "Budi";
function sapa() {
    echo "Halo, $nama";
}
sapa();
?>
  1. Buat function hitungKata($kalimat) yang mengembalikan jumlah kata, lalu panggil dengan 3 kalimat berbeda

Summary

PoinPenjelasan
Local scopeVariabel hanya ada di dalam function
Global scopeVariabel di luar function; butuh global untuk akses
$GLOBALSArray superglobal berisi semua variabel global
Static variableNilai dipertahankan antar pemanggilan function
Superglobals$_GET, $_POST, $_SERVER, dst — akses di mana saja
Best practicePrefer parameter + return daripada global
Common mistakeMengira variabel global terlihat otomatis di function

Klik tombol ini setelah menyelesaikan materi

📝

Quiz Bab 6

Uji pemahamanmu tentang Function