Sobes.tech
Junior

Jakie są zakresy widoczności zmiennych w PHP?

sobes.tech AI

Odpowiedź od AI

  • Globalne: Zmienne zadeklarowane poza funkcjami lub klasami są dostępne w zakresie globalnym. Wewnątrz funkcji należy się do nich odwołać za pomocą słowa kluczowego global lub tablicy superglobal $GLOBALS.
  • Lokalne: Zmienne zadeklarowane wewnątrz funkcji są dostępne tylko w tej funkcji.
  • Statyczne: Zmienne zadeklarowane słowem kluczowym static wewnątrz funkcji zachowują swoją wartość między wywołaniami.
  • Parametry funkcji/metody: Parametry przekazywane do funkcji lub metody są dostępne tylko wewnątrz tej funkcji/metody jako zmienne lokalne.
  • Właściwości klasy: Właściwości klasy (zadeklarowane z modyfikatorami public, protected, private) są dostępne w kontekście obiektu tej klasy.
<?php
// Zakres globalny
$globalVar = 'Jestem globalny';

function testScope() {
    // Zakres lokalny
    $localVar = 'Jestem lokalny';

    // Dostęp do zmiennej globalnej za pomocą słowa kluczowego global
    global $globalVar;
    echo $globalVar . "\n";

    // Dostęp do zmiennej globalnej za pomocą $GLOBALS
    echo $GLOBALS['globalVar'] . "\n";

    echo $localVar . "\n";
    // echo $staticVar; // Błąd: niezdefiniowana zmienna
}

function testStatic() {
    // Zakres statyczny
    static $staticVar = 0;
    $staticVar++;
    echo "Zmienna statyczna: " . $staticVar . "\n";
}

function testParameters($param) {
    // Zakres parametru
    echo "Parametr: " . $param . "\n";
}

testScope();
testStatic(); // Wynik: Zmienna statyczna: 1
testStatic(); // Wynik: Zmienna statyczna: 2
testParameters('Cześć');

class MyClass {
    public $publicProperty = 'Jestem publiczny';
    protected $protectedProperty = 'Jestem chroniony'; // Dostępne w klasie i podklasach
    private $privateProperty = 'Jestem prywatny';     // Dostępne tylko w klasie

    public function accessProperties() {
        echo $this->publicProperty . "\n";
        echo $this->protectedProperty . "\n";
        echo $this->privateProperty . "\n";
    }
}

$obj = new MyClass();
$obj->accessProperties();
// echo $obj->privateProperty; // Błąd: prywatna właściwość
?>