Jeśli zaczynasz swoją przygodę z PHP, pewnie już spotkałeś się ze słowem „zmienna”. I nic dziwnego — bez zmiennych nie da się napisać nawet prostego programu. To właśnie one przechowują dane, z którymi nasz kod pracuje. Ale… czy wiesz, że istnieją różne rodzaje zmiennych w zależności od miejsca, w którym są zadeklarowane i używane?
Mowa oczywiście o zmiennych lokalnych i zmiennych globalnych. I chociaż brzmi to poważnie, różnica między nimi jest całkiem prosta — ale bardzo ważna. Zrozumienie jej pozwoli Ci uniknąć masy błędów, które popełnia większość początkujących programistów PHP.
W tym artykule wytłumaczę Ci:
- czym dokładnie są zmienne lokalne i globalne,
- jak działają w praktyce,
- jak z nich korzystać (i kiedy lepiej tego nie robić),
- oraz pokażę kilka przykładów kodu, które rozjaśnią temat.
Zaczynajmy!
Co to jest zmienna w PHP?
Zanim przejdziemy do globalnych i lokalnych, przypomnijmy sobie krótko, czym w ogóle jest zmienna.
W PHP zmienna to miejsce w pamięci, w którym można przechowywać dane — na przykład liczbę, tekst, tablicę czy obiekt. Każda zmienna w PHP zaczyna się od znaku $, np.:
<?php $imie = "Kasia"; $wiek = 25; echo "Mam na imię $imie i mam $wiek lat."; ?>
Proste, prawda?
Ale teraz wyobraź sobie, że tworzysz funkcję, w której chcesz użyć tej samej zmiennej. I nagle okazuje się, że PHP krzyczy błędem lub nie widzi Twojej zmiennej. Dlaczego?
Bo — i tu dochodzimy do sedna — zmienna ma zasięg (ang. scope), czyli obszar, w którym „istnieje” i może być używana.
Zasięg zmiennej (variable scope)
Zasięg zmiennej określa, gdzie w kodzie możesz się do niej odwołać. W PHP istnieją cztery główne zasięgi:
- Lokalny (local) — zmienna widoczna tylko wewnątrz funkcji.
- Globalny (global) — zmienna widoczna w całym skrypcie, poza funkcjami.
- Statyczny (static) — zmienna, która zachowuje wartość między wywołaniami funkcji.
- Superglobalny (superglobal) — specjalne zmienne dostępne zawsze, wszędzie (np.
$_POST,$_GET).
W tym artykule skupimy się na dwóch pierwszych: globalnych i lokalnych, bo to one najczęściej powodują zamieszanie.
Zmienne lokalne — co to takiego?
Zmienne lokalne to takie, które istnieją tylko wewnątrz funkcji lub bloku kodu, w którym zostały zadeklarowane.
Nie możesz się do nich odwołać spoza tej funkcji — PHP po prostu ich „nie widzi”.
Zobacz przykład:
<?php
function przywitaj() {
$imie = "Ania"; // zmienna lokalna
echo "Cześć, $imie!";
}
przywitaj();
// próba dostępu spoza funkcji
echo $imie; // BŁĄD! Zmienna nie istnieje tutaj
?>
Co się dzieje?
Zmienna $imie została utworzona wewnątrz funkcji przywitaj(). Gdy funkcja się kończy — zmienna znika.
Poza nią nie ma po niej śladu, więc PHP wyświetli błąd lub pustą wartość.
To bardzo podobne do sytuacji, gdy masz pudełko z napisem „Ania” w pokoju. Możesz je otworzyć, dopóki jesteś w tym pokoju (czyli w funkcji). Ale gdy wyjdziesz — pudełko zostaje w środku, a Ty nie masz do niego dostępu.
Zmienne globalne — czyli zmienne widoczne wszędzie
Zmienna globalna to taka, która została zadeklarowana poza funkcją, na najwyższym poziomie kodu (czyli w tzw. globalnym zasięgu).
Teoretycznie jest „widoczna” wszędzie, ale… nie do końca.
Zobacz przykład:
<?php
$imie = "Tomek"; // zmienna globalna
function przywitaj() {
echo "Cześć, $imie!"; // BŁĄD! PHP nie widzi zmiennej globalnej wewnątrz funkcji
}
przywitaj();
?>
Zaskoczony?
W PHP zmienne globalne nie są automatycznie dostępne wewnątrz funkcji.
Dlaczego? Bo funkcje mają swój własny, odizolowany „świat” — własny zasięg.
Jeśli chcesz użyć zmiennej globalnej w środku funkcji, musisz ją zadeklarować jako globalną.
Zróbmy to poprawnie:
<?php
$imie = "Tomek";
function przywitaj() {
global $imie; // odwołanie do zmiennej globalnej
echo "Cześć, $imie!";
}
przywitaj();
?>
Teraz działa!
Słowo kluczowe global mówi PHP: „Hej, chcę użyć tej zmiennej z głównego zakresu, a nie tworzyć nową lokalną”.
Różnica między zmienną globalną a lokalną
Spróbujmy to podsumować w prosty sposób:
| Cecha | Zmienna lokalna | Zmienna globalna |
|---|---|---|
| Gdzie jest deklarowana | Wewnątrz funkcji | Poza funkcjami |
| Dostępność | Tylko w funkcji | W całym skrypcie (ale nie bezpośrednio w funkcjach) |
| Żywotność | Tylko podczas działania funkcji | Przez cały czas trwania skryptu |
| Jak uzyskać dostęp w funkcji | Automatycznie | Przez global lub $GLOBALS |
| Przykład | $x = 5; wewnątrz funkcji | $x = 5; poza funkcją |
Jak korzystać ze zmiennych globalnych – z głową!
Zmienne globalne mogą wydawać się wygodne — w końcu można ich użyć „wszędzie”. Ale uwaga: to pułapka.
Nadużywanie ich prowadzi do tzw. spaghetti code, w którym trudno się połapać.
Jeśli masz 10 funkcji, które zmieniają tę samą globalną zmienną, bardzo łatwo o błąd.
Zamiast tego lepiej przekazywać zmienne jako argumenty funkcji.
To czystsze, bezpieczniejsze i bardziej przewidywalne rozwiązanie.
Zobacz dwa podejścia:
❌ Zły sposób — używanie globali
<?php
$licznik = 0;
function zwieksz() {
global $licznik;
$licznik++;
}
zwieksz();
zwieksz();
echo $licznik; // 2
?>
Działa, ale jeśli kod stanie się większy, może być trudno śledzić, kto zmienia $licznik.
✅ Dobry sposób — przekazywanie jako argument
<?php
function zwieksz($licznik) {
return $licznik + 1;
}
$licznik = 0;
$licznik = zwieksz($licznik);
$licznik = zwieksz($licznik);
echo $licznik; // 2
?>
Prościej, bezpieczniej i bardziej przewidywalnie.
Alternatywa: tablica $GLOBALS
PHP udostępnia specjalną superglobalną tablicę o nazwie $GLOBALS.
Zawiera ona wszystkie zmienne globalne, do których możesz się odwołać w dowolnym miejscu, nawet wewnątrz funkcji — bez użycia słowa global.
Zobacz:
<?php
$imie = "Ola";
function przywitaj() {
echo "Cześć, " . $GLOBALS['imie'] . "!";
}
przywitaj(); // Cześć, Ola!
?>
To przydatne, jeśli potrzebujesz szybkiego dostępu, ale nie chcesz deklarować global $imie; w każdej funkcji.
Jednak uwaga: nadużywanie $GLOBALS też nie jest dobrym pomysłem. W dużych projektach łatwo się w tym pogubić.
Jak PHP zarządza zmiennymi w pamięci?
To może brzmieć technicznie, ale zrozumienie tego pozwoli Ci lepiej pisać kod.
Gdy tworzysz zmienną globalną, PHP przechowuje ją w pamięci do końca działania skryptu.
Zmienne lokalne natomiast są tworzone tymczasowo — tylko na czas wywołania funkcji. Gdy funkcja się kończy, PHP automatycznie je usuwa.
To dlatego lokalne zmienne są bardziej „bezpieczne” — nie zostają w pamięci dłużej, niż to potrzebne, i nie mogą przypadkiem nadpisać danych z innej części programu.
Kiedy używać zmiennych globalnych?
Zmienne globalne nie są złe z natury — trzeba tylko używać ich z umiarem.
Warto po nie sięgnąć, gdy:
- potrzebujesz jednej wartości, dostępnej w wielu miejscach (np. konfiguracja, ustawienia aplikacji),
- masz mały, prosty skrypt, gdzie przejrzystość nie cierpi,
- chcesz przechować dane tymczasowe, np. licznik odwiedzin, sesję itp.
W każdym innym przypadku — lepiej używać parametrów funkcji lub klas obiektowych (OOP).
Dodatkowa ciekawostka: zmienne statyczne
Wspomnieliśmy wcześniej o zmiennych statycznych. To taki hybrydowy typ — mają zasięg lokalny, ale „pamiętają” swoją wartość między wywołaniami funkcji.
Zobacz przykład:
<?php
function licznik() {
static $liczba = 0;
$liczba++;
echo "Liczba wywołań: $liczba <br>";
}
licznik(); // 1
licznik(); // 2
licznik(); // 3
?>
Zmienna $liczba zachowuje się jak lokalna, bo istnieje tylko wewnątrz funkcji, ale jej wartość nie znika po zakończeniu działania.
To idealne rozwiązanie np. do tworzenia liczników czy pamiętania stanu.
Kod w praktyce – mały projekt testowy
Na koniec zróbmy coś praktycznego.
Oto prosty skrypt PHP, który pokaże, jak współpracują zmienne lokalne i globalne w prawdziwym kodzie.
<?php
// Zmienna globalna
$saldo = 1000;
function wplac($kwota) {
global $saldo;
$saldo += $kwota;
echo "Wpłacono $kwota zł. Nowe saldo: $saldo zł.<br>";
}
function wyplac($kwota) {
global $saldo;
if ($saldo >= $kwota) {
$saldo -= $kwota;
echo "Wypłacono $kwota zł. Pozostało: $saldo zł.<br>";
} else {
echo "Za mało środków! Saldo: $saldo zł.<br>";
}
}
wplac(200);
wyplac(500);
wyplac(900);
?>
Wynik działania:
Wpłacono 200 zł. Nowe saldo: 1200 zł. Wypłacono 500 zł. Pozostało: 700 zł. Za mało środków! Saldo: 700 zł.
W tym przykładzie $saldo to zmienna globalna — jest wspólna dla wszystkich funkcji.
Działa to dobrze, ale gdybyś pisał większą aplikację bankową, lepiej byłoby przekazywać saldo do funkcji jako argument lub użyć klasy obiektowej.
Różnica między zmiennymi globalnymi a lokalnymi w PHP sprowadza się głównie do zasięgu i dostępności:
- Zmienne lokalne istnieją tylko w funkcji i są bezpieczniejsze w użyciu.
- Zmienne globalne istnieją w całym skrypcie, ale nie są automatycznie dostępne w funkcjach — trzeba je zadeklarować przez
globallub$GLOBALS. - Nadużywanie globalnych zmiennych może prowadzić do chaosu — lepiej przekazywać dane jako parametry lub używać obiektów.
Jeśli zapamiętasz te zasady, Twój kod stanie się czytelniejszy, bezpieczniejszy i łatwiejszy w utrzymaniu.