PHP Değişken etki alanı

Bir değişkenin etki alanı içinde tanımlandığı bağlamdır. Hemen her PHP değişkeninin sadece tek bir etki alanı vardır. Bu tek etki alanı betiğe include ve require ile dahil edilen dosyalara da uzanır. Örneğin:

<?php
$a = 53;
include "inc.php";
?>

Örnekte $a değişkeni inc.php değişkeni içerisinde geçerli olur. Yani inc.php içerisinde echo $a; gibi bir kodumuz var ise 53 değerini ekrana yazdıracaktır.

Fakat sayfada tanımladığımız bir değişkeni fonksiyon içerisinde kullanmak istersek çalışmayacaktır. Örneğin aşağıdaki kod çalışmaz.

$a = 1; /* küresel etki alanı */

function deneme()
{
    echo $a; /* işlevin etki alanı -- fonksiyon dışındaki $a değişkeni bu şekilde çağrılamaz.*/
}

deneme(); // hata verecektir.

Değişkeni fonksiyon içerisinde kullanabilmek için global sözcüğünü kullanmalıyız.

global anahtar sözcüğü

İlk olarak, global kullanımına bir örnek verelim:

$a = 1;
$b = 2;

function topla()
{
    global $a, $b;
    $b = $a + $b;
}

topla();
echo $b; //Ekrana 3 çıktısı verir

Örnekte global sözcüğü ile $a ve $b değişkenlerinin dışarıdaki değişkenler olduğunu fonksiyona bildirdik. Bu sayede $b değişkeninin değerini değiştiren bir fonksiyon yazabildik.

Küresel etki alanındaki değişkenlere erişimin ikinci yolu PHP tarafından tanımlanmış özel $GLOBALS ifadesini kullanmaktır. Önceki örnek şu şekilde yazılabilir:

$a = 1;
$b = 2;

function topla()
{
    $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}

topla();
echo $b;

static değişkenlerin kullanımı

Değişken etki alanı ile ilgili önemli özelliklerden biri statik değişkenlerdir. Bir statik değişken sadece fonksiyonun etki alanında geçerli olur, fonksiyonun çalışması bittiğinde static değişken değerini kaybetmez.

function dene()
{
    $a = 0;
    echo $a;
    $a++;
}

Bu fonksiyon her çağrıldığında $a’yı 0 yapar ve 0 yazdırır, bu nedenle oldukça kullanışsızdır. Değişkeni artıran $a++ bir işe yaramaz çünkü fonksiyon çalışması sona erdiğinde $a değişkeni kaybolur. Şöyle düşüne bilirsiniz, fonksiyon içindeki değişkenler fonksiyonun içerisinde geçerlidir sonra yok olur.

Kaldığı değeri kaybetmeyecek kullanışlı bir sayaç fonksiyonu olması için $a değişkeni aşağıda static olarak bildirilmiştir.

function dene()
{
    static $a = 0;
    echo $a;
    $a++;
}

Artık, $a değişkeni sadece dene() işlevinin ilk çağrılışında ilklendirilecek ve işlevin her çağrılışında $a değişkeninin değerini bastıktan sonra değerini bir artıracaktır. Yani static değişken fonksiyondan çıkıldığında kaybolmaz yaşamaya devam eder.

Kendi kendini çağıran (recursive) fonksiyonlarda statik değişken kullanarak bir örnek:

function say()
{
    static $sayaç = 0;

    $sayaç++;
    echo "$sayaç\n";
    if ($sayaç < 10) {
        say();
    }
    $sayaç--;
}
say();

Bilginize: statik değişkenler yukarıdaki örneklerde yapıldığı gibi tanımlanabilir. PHP 5.6 itibariyle, bu değişkenlere ifadelerin sonuçlarını değer olarak atayabilirsiniz fakat burada herhangi bir fonksiyon kullanamazsınız, bu bir çözümleme hatasına sebep olur.

function foo(){
    static $int = 0;          // doğru
    static $int = 1+2;        // doğru  (PHP 5.6 itibariyle)
    static $int = sqrt(121);  // yanlış (fonksiyon ile atandığı için)

    $int++;
    echo $int;
}


Leave a Comment

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.