Sayfalar

Kod Yazmak - 3


Degiskenlerin Fonksiyonlarla Kullanilmasi

Bu konumuz icerisinde sizlere fonksiyonlarin icinde kullandigimiz degiskenlerin fonksiyonun disinda bize gerekli olup olmadigini belirlememizi saglayacak bazi kurallar gosterecegiz.Bu olaya programcilik literarunde "degiskenin omru" adi verilir.

Bir degisken yaratildigi anda hafizada kucuk bir parca o degiske'nin kullanimi icin ayrilir.Bizler fonksiyonun icinde kullandigimiz degiskenlerin fonksiyon isini bitiridikten sonra yasamalarini istemeyiz.Bu nedenle PHP,fonksiyon calismasini bitirdikten sonra fonksiyonun icindeki degiskenleri "kapatip" omurlerinin "bitmesini" saglar.Fonksiyonun icinde yer alan degiskenler fonksiyon calismasini bittirdikten sonra "oldurulur" "yok edilir".

Fonksiyonun disindan o degiskene yapilacak refeanslar artik "illegal" "invalid" yani "gecersiz"olarak kabul edilir ve hata ile sonuclanir.

Cunku artik o degisken hicbir "degeri" saklamiyordur.

Global ve Yerel Degiskenler

Fonksiyo'nun disinda yaratilan butun degiskenlerin omru "web sayafasinin gosterim suresi" omru ile aynidir.Istemci - Server arasindaki bu iliskide degiskenler sahip olduklri degerleri koruyacaktir.

Degiskenlerle ilgili bu konsepte "scope" adi verilir.Fonksiyonun icinde tanimlanan butun degiskenler bu anlamda "local scope" adini alir.

Omurleri o sayfa ile ilgili butun islemler boyunca sona ermeyen diger degiskenlere ise "global scope" adi verilir.

Bir ornek verelim ve konuyu daha iyi anlayalim,

<?php
$HosgeldinMesaji = "Merhaba Dostum"; <--------------Global Degisken

function Karsilama_Mesajini_Cevir ($HosgeldinMesaji)
{
$HosgeldinMesaji = "Hello my Buddy"; <--------------Local Degisken
return $HosgeldinMesaji;
}

Karsilama_Mesajini_Cevir ();
echo $HosgeldinMesaji;
?>

Ilk satirda degiskenimiz global olarak tanimlanip ona "Merhaba Dostum" degeri veriliyor.Bu kisimda anlasilmayacak bir sey yok.Biz fonksiyon icinde yine bu $HosgeldinMesaji degiskenine "Hello my Buddy" degerini atadik.Sonrada fonksiyonu calismasi icin cagirdik.Unutmayin burada (yani fonksiyonun icinde)$HosgeldinMesaji bir "local degiskendir".Eger bu programi calistirirsaniz,

"Merhaba Dostum" mesajini alirsiniz.Sebebini aciklayalim,

Cunku fonksiyonun icinde yer alan degisken ile bizim programimizin basinda tanimladigimiz degiskenin efekti tamamen farkli olacaktir.Degiken fonksyion icinde localdir.

Bir onemli uyari : Biz fonksiyon'un icinde yanlizca degeri "return" kullanarak dondurduk.Eger fonksiyon icinde "echo" kullansaydik sonuc gene degismeyecek ve sonucta ekranda "Merhaba Dostum" yazisi goruntulenecekti.Cunku "$HosgeldinMesaji" degiskeni global olarak tanimlidir.

Simdi bu sekilde kullanalim ve sonuca bakalim.Hatta bu sefer degisken ismini de degistirelim.

<?php
$HosgeldinMesaji = "Merhaba Dostum";

function Karsilama_Mesajini_Cevir ($IngilizceMesaj)
{
$IngilizceMesaj = "Hello my Buddy";
return $IngilizceMesaj;
}

Karsilama_Mesajini_Cevir ();
echo $HosgeldinMesaji;
echo $IngilizceMesaj;

?>

$IngilizceMesaj degiskeni hic bir deger saklamamaktadir.Bu kisim cok onemlidir ve program yazmanin en temel taslarindan bir tanesidir.

Fonksiyonda "return" kullanarak degikenin degerini dondurdugunuz anda degiskenin "yasama omru" otomatik olarak sona erdirilir .Fonksiyonun icinde dondurulen deger fonksiyonun disinda hic bir deger saklamayacaktir.Kisaca fonksyionun icinde yasayan degisken fonksiyonun disinda tam bir oludur ve ici bostur.

Global Degiskenleri Fonksiyonun Icinde Kullanmak

Yukaridaki aciklamanin birde tersini dusunelim.Biz $HosgeldinMesaji degiskenini fonksiyon icinde "echo" ile gostermek isteseydik sonuc ne olacakti?

<?php
$HosgeldinMesaji = "Merhaba Dostum";

function Karsilama_Mesajini_Cevir ($IngilizceMesaj)
{
echo $HosgeldinMesaji;
$IngilizceMesaj = "Hello my Buddy";
return $IngilizceMesaj;
}

Karsilama_Mesajini_Cevir ();
echo $HosgeldinMesaji;
echo $IngilizceMesaj;
?>

Bu hicbirseyi degisitrmeyecek ve ilk kuralimizda oldugu gibi tersine olarakta $HosgeldinMesaji degiskeni fonksyionun icinde hic bir sey ifade etmeyecektir.Fonksiyonun icinde bu degiskenin degeri yoktur.Bostur.Cunku fonksiyon icinde bu degisken tanimlanmamsitir.

Fonksiyonun disindaki bir degiskeni fonksiyon icinde kullanmak istersek bunun icin iki yol bulunmaktadir.

Birinci Yol asagida gosterilmistir.

<?php
$HosgeldinMesaji = "Merhaba Dostum";

function Karsilama_Mesajini_Cevir ($IngilizceMesaj)
{
global $HosgeldinMesaji;
echo $HosgeldinMesaji;
$IngilizceMesaj = "Hello my Buddy";
return;
}

Karsilama_Mesajini_Cevir ();
echo $HosgeldinMesaji;
?>

yukaridaki kucuk programda $HosgeldinMesaji degiskenini global olarak tanimladik.Daha onceden belirttigimiz gibi eger degiskeni "global" olarak tanimlamadan fonksiyon icinde kullandigimizda hic bir sey ifade etmiyordu.PHP sanki onu hic yazilmamis,tanimlanmamis gibi degerlendirecktir.

Simdi yukarida degiskenimizi "global" olarak tanimladik.Artik programin ciktisi beklenen sekilde "Merhaba Dostum" olacaktir.

Ikinci Yol : PHP bu sekilde global tanimlanan degiskenleri $GLOBALS dizisinde saklamaktadir.

Eger dizi icerisinde saklanan global degiskenlerin degerini ekrana yazmak istersek,

<?php
$HosgeldinMesaji = "Merhaba Dostum";

function Karsilama_Mesajini_Cevir ($IngilizceMesaj)
{
echo $GLOBALS["HosgeldinMesaji"]; <------------------Birinci "Merhaba Dostum"
echo $HosgeldinMesaji;
$IngilizceMesaj = "Hello my Buddy";
return $IngilizceMesaj;
}

Karsilama_Mesajini_Cevir ();
echo $HosgeldinMesaji; <------------------Ikinci "Merhaba Dostum"
echo $IngilizceMesaj; <--------------------Hic bir sey ifade etmiyor.
?>

Yukaridaki son iki ornekte de ekranda iki tane alt alta "Merhaba Dostum" yazisinin ciktigini gorursunuz.Bu yazilardan birincisi fonksiyonun icinde tanimlanan digeride fonksiyonun disinda tanimlanan kod parcasinin ciktilaridir.

Tabii ki $IngilizceMesaj degiskeni hic bir deger gostermeyecektir.Cunku degiskeni fonksiyonun disinda yanlizca "echo" ettik.($IngilizceMesaj degiskeni yanlizca fonksiyonun icinde yasayan disariya cikinca olen bir varlik gibidir.Ama "global" olarak tanimladigimiz $HosgeldinMesaji hem fonksiyon icinde hem fonksiyon disinda yasayabilmektedir)

"global" komutunu kullanmak biraz daha kolay geliyor insanlara.Oysaki $GLOBALS dizisini kullanmakta goruldugu kadar zor degildir.

Degisken ismini "" tirnak isaretlerinin arasina "$" dolar ifadesi olmadan [] koseli parentezlerin icinde yazmaniz yeterlidir.

$GLOBALS ["DegiskenIsmi"];

Bu dizinin kullanimi bir onceki konularda bahsettigimiz "string diziler" konusu ile aynidir.Her turlu dizi islemini "diziler" makalesinde belirttigimiz sekilde yapabilirsiniz.

Eger bir fonksiynu devamli olarak cagiracaksaniz ve fonksiyonun dondurdugu degiskenin degerini hatirlamasini istiyorsaniz ne yapacaksiniz?

Hatilayacaginiz gibi bir fonksioyonun dondurdugu degisken degeri fonksiyon disina "return" ile cikildiginda "olduruluyordu".Bazi durumlar icin bunu istemiyor olabiliriz.

function web_sayfasi_hit_sayaci ()
{
return $Kisi_Sayisi = $Kisi_Sayisi + 1;
}

Fonksiyonun her cagrilimasinda degismeyen degiskenlere "static degiskenler" denilir.Siz yanlizca fonksyionun arka arkaya cagrilma islemleri sirasinda degiskenin tanimli olmasina dikkat etmelisiniz.

function web_sayfasi_hit_sayaci ()
{
static $Kisi_Sayisi = 0;
return $Kisi_Sayisi = $Kisi_Sayisi + 1;
}

Burada bir seyi aciklamak durumundayiz.Gordugunuz gibi ilk satirda "static" komutu ile beraberce $Kisi_Sayisi degiskenine "0" degerini atadim.Fonksiyon ilk cagrildiginda bu "static" komutu degerlendirilecek ve degiskenin degerini israrla saklamak istedigimizi ve PHP'nin onu yok etmemesini sagladik.Bu "static" komutu fonksyion ilk calistiginda kullanilacak fakat daha sonraki fonksiyon cagirmlarinda goz ardi edilecektir.

Eger yukaridaki fonksiyonun ciktisini "echo" etseydik,

echo ( web_sayfasi_hit_sayaci () ); <---1 degerini dondurur.
echo ( web_sayfasi_hit_sayaci () ); <---2 degerini dondurur.
echo ( web_sayfasi_hit_sayaci () ); <---3 degerini dondurur.

Simdiye kadar global,local,ve static degiskenleri inceledik.

# Global degiskenler degerlerini tum programin calismasi boyunca korurular.Eger fonksyionlarin icinde kullanmka isterseniz GLOBALS komutlarini kullanmalisiniz.
# Local degiskenler yanlizca fonksiyonun icinde tanimlidir ve fonksiyonun cagrilmasi sureci boyunca yasarlar.Fonksiyon gorevini bitirince otomatik olarak yok edilirler.
# Static degiskenler degerlerini fonksiyon icinde israrli bir sekilde saklarlar.Fonksiyon her cagrildiginda bu degerler degismez.

Simdi bir uygulama yapalim.

1.Text editorunuzu acin ve asagidakileri yazin.
<HTML>
<HEAD></HEAD>
<BODY>
<BR>
<BR>
<FONT SIZE= -1>

<?php
$GlobalDegisken = "Global";

function local ()
{
$LocalDegisken = "Local";
static $StatikDegisken = 0;
echo "<BR>Global degiskenin degeri". $GLOBALS["GlobalDegisken"];
echo "<BR>Local degiskenin degeri $LocalDegisken ";
echo "<BR>Statik degiskenin degeri $StatikDegisken ";
return $StatikDegisken = $StatikDegisken + 1;
}

echo "Fonksiyonu ilk defa cagirdik...";
local ();

echo "<BR><BR>Fonksiyonun disina cikiyoruz degerlere bakin";
echo "<BR> Global degiskenin degeri $GlobalDegisken";
echo "<BR> Local degiskenin degeri $LocalDegisken";
echo "<BR> Statik degiskenin degeri $StatikDegisken";

echo "<BR><BR>Fonksiyonu ikinci defa cagirdik...";
local ();

echo "<BR><BR>Fonksiyonun disina cikiyoruz degerlere bakin";
echo "<BR> Global degiskenin degeri $GlobalDegisken";
echo "<BR> Local degiskenin degeri $LocalDegisken";
echo "<BR> Statik degiskenin degeri $StatikDegisken";

echo "<BR><BR>Fonksiyonu ucuncu defa cagirdik...";
local ();

echo "<BR><BR>Fonksiyonun disina cikiyoruz degerlere bakin";
echo "<BR> Global degiskenin degeri $GlobalDegisken";
echo "<BR> Local degiskenin degeri $LocalDegisken";
echo "<BR> Statik degiskenin degeri $StatikDegisken";

?>
</FONT>
</BODY>
</HTML>

2.Bu dosyayi "cimbom.php" olarak kayit edin. :))

3."cimbom.php" acin ve sonuclara goz gezdirin.

Program nasil calisiyor?

Ilk satirda her zamanki gibi bir degisken yaratip ona deger atadik.(Degiskenimizi herhangi bir fonksiyon icinde yaratmadik o yuzden degiskenimiz global bir degisken)

$GlobalDegisken = "Global";

Fonksiyonun icinde her zamanki gibi bir degisken yaratip deger atadik.(Dogal olarak fonksiyon icinde yaratilan her degisken local degisken olacaktir.)
$LocalDegisken = "Local";

Fonksiyonun icinde bir "statik" degisken yarattik ve deger atadik.(fonksiyon icinde yarattigimiz bu degiskenin degeri fonksiyon disina cikildiginda,eger fonksiyonu ikinci kez ucuncu kez calistirrisaniz hatirlanacaktir)

static $StatikDegisken = 0;

programmimiz local () satiri ile calismaya basliyor.


Her defasinda fonksiyon cagrildiginda degerleri ekrana yaziyor.