TRForumcu.NeT (Arşiv Ana sayfa) => Asp & Php

Konu: { Değişkenlerin kapsamı: global ve static | Php

Sayfa: [ 1 ]

|| Kontecau || 20.01.2008 12:43:14
Yukarıda hesapla.php örneğini birlikte yaptıysak, bir noktadikkatinizi çekmiş olmalı: dört fonksiyonda da aynı değişken adlarınıkullanıyoruz ve sonucu aynı isimle print() fonksiyonuna gönderiyoruz.PHP nasıl oluyor da, aynı isimli değişkenleri buradaki gibi ayrı ayrıdeğerlerle ele alabiliyor? Bu sorunun cevabını verebilmek içindeğişkenlerin kapsam alanına bakmamız ve ve bu arada globaldeyimi ile tanışmamız gerekir.Bir fonksiyonun değişkenleri, sadece o fonksiyonun ömrü süresincevardır; hiç bir fonksiyon diğer bir fonksiyonun değişkenlerinin veyakendisine verilmemiş bir başka değişkenin değerini bilemez; kullanamaz.Bunu hemen bir örnekle görelim. Şu kodu kapsam01.php adıyla kaydedin:
Alıntı
<HTML>
<HEAD>
<TITLE>PHP'de Fonksiyon</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
$metin = "Başkalarına yararlı olmanın sınırı yoktur!";
function yazdir () {
    print ("<h1>İşte metin: $metin </h1>");
    }
// Başka kodlar buraya girebilir
    yazdir();
?>
</BODY>
</HTML>

Normal görünüşlü bir fonksiyon ve kendisinden önce tanımlanmış olan$metin adlı değişkenin tuttuğu değeri, kendisi göreve çağrıldığı andaBrowser penceresinde görüntülemeye hazır görünüyor! Fonksiyonundışarıdan argüman istemediğini, kullanacağı print() komutununkonusu olarak $metin değişkeninin değerini kullanacağını daanlıyabiliyoruz. Fakat bu programı çalıştırdığımızda karşımıza çıkanmanzara çok farklı oluyor.
Fonksiyonunçalıştığını, yazdırması beklenen şeylerin ilk bölümünü yazdırmışolmasından anlayabiliriz. Fakat, $metin değişkeninin değeri nerede?Şimdi bu sorunun cevabını biliyoruz: $metin değişkeni fonksiyonunkapsama alanı (scope) dışında! Bir fonksiyon kendisine verilmeyen veyakendi içinde tanımlanmayan bir değişkeni kullanamaz; bilemez,değerinden haberi olmaz. Nitekim bu görüntüyü aldığınız sırada kaynakkodlarına bakarsanız, "<h1>..</h1>" etiketlerinin arasındasadece "İşte metin:" kelimelerinin bulunduğunu göreceksiniz.
Bir fonksiyonun dışında tanımladığımız değişkenlerimizi fonksiyona tanıtabilmek için global deyimini kullanırız; böylece değişken bütün program boyuinca küresel nitelik kazanmış olur:
Aynı kodun fonksiyon bölümünü şöyle değiştirerek, kapsam02.php adıyla kaydedin:
Alıntı
function yazdir () {
    global $metin;
    print ("<h1>İşte metin: $metin </h1>");
    }

Programımızı çalıştırdığımızda, bu kez metnin arzu ettiğimiz gibi görüntülendiğini göreceğiz.
Bu noktada dikkat etmemiz gereken şey, globaldeyimi ile kendisine kullanılmak üzere verilen değişken, artık birbakıma fonksiyonun malı olur ve fonksiyon tarafından değerideğiştirilebilir. Bütün program boyunca kullanmaya niyetli olduğunuzglobal değişkenlerin, kullanımına verildiği fonksiyon tarafındandeğiştirilip-değiştirilmediğine dikkat edin. Bir değişkenin bütünprogramda gerekli olmadığı ve sadece bir fonksiyon içinde kullanılacağıdurumlarda bu değişkeni fonksiyonun içinde tanımlamak daha doğru olur.Fakat daha önce belirttiğimiz gibi fonksiyonların içinde tanımlanandeğişkenler fonksiyon çalışırken var olur; fonksiyon sona erdiğinde deölür. Başka bir deyişle, bir fonksiyonun içinde oluşturduğumuz birdeğişkenin fonksiyon sona erdiğinde sıfırlanmaması için bir çare olmasıgerekir. Bu çarenin adı, static deyimidir. Şöyle bir örnek düşünelim:Sitemizdeki bir hesaplama fonksiyonu ziyaretçilerimizin yenialışverişlerinin toplamını eski toplama ekleyerek, yeni ana toplamıbuluyor ve ziyaretçi alışveriş sepetine yeni bir mal ekledikçe, ve oandaki ana toplamın ne olduğunu öğrenmek istedikçe, fonksiyonumuzuneski ana toplamı hatırlaması gerekiyor. Şu andaki PHP bilgimizle böylebir program yazmaya kalkmayalım; ama daha basit bir örnek olarak bukodu static.php adıyla kaydedelim:
Alıntı
<HTML>
<HEAD>
<TITLE>PHP'de Fonksiyon</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
function saydir () {
    static $sayi = 0;
    $sayi++;
    print ("<h3>Fonksiyonun tuttuğu sayı: $sayi </h3>");
    }
// Başka kodlar buraya girebilir
    print ("<h2>Fonksiyonun birinci kez çağrılması:</h2>");
    saydir();
    print ("<h2>Fonksiyonun ikinci kez çağrılması:</h2>");
    saydir();
    print ("<h2>Fonksiyonun üçüncü kez çağrılması:</h2>");
    saydir();
    print ("<h2>Fonksiyonun dördüncü kez çağrılması:</h2>");
    saydir();
?>
</BODY>
</HTML>

Bu programı, static deyimi olmadan çalıştıracak olursak,saydir() fonksiyonu her çağrıldığında $sayı değişkeninin baştantanımlandığını ve bir türlü 1'den ileri gidemediğini göreceğiz. static ise fonksiyon bittikten sonra $sayi değişkeninin değerinin değişmeden kalmasını sağlayacaktır.
Şimdi, bir PHP programının gerektirdiği hemen herşeyi görmüş olduk;sadece iki özel araç, dizi değişkenler ve nesneler (Objects) kaldı.Bunları da gelecek bölümde ele aldıktan sonra, PHP'yi gerçek ortamda,Web'de kullanmaya başlayabiliriz.


Sayfa: [ 1 ]