|
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.
Ornek Dosyalar
http://www.turk-php.com/ornekler/cimbom.php
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.
Her turlu gorus ve dusuncenizi lutfen bu sayfanin altinda
yer alan kisima yazmayi unutmayiniz.Ancak bu sekilde bizler
yaptigimizin odulunu almis olacagiz.
Saygilar,
Serkan Hadi Ceylani
serkan@turk-php.com
|