PHP - Dersleri - 5

Abdullah Şahin

Altın Üye
Altın Üye
Kayıt
3 Nisan 2008
Mesaj
2.630
Tepki
89
PHP'de Fonksiyonlar

Her programlama dilinde olduğu gibi PHP'de de dilin kendi sunduğu fonksiyonlar dışında bir fonksiyon yazmak istediğimiz zaman onu şöyle güzelcene bir tanımlarız. Bu tanımlama merasimine hazırlanmak adına size bazı arkadaşlarımızı tanıştırmak istiyorum: Parametreler

Parametreler bir fonksiyona içi dolu kutuları taşımak istediğimiz zaman bize bu lojistik desteği sağlayan arkadaşlarımız oluyorlar kendileri, bizzat... Daha doğrusu parametreler bir fonksiyona ön değerler göndermek istediğimiz zaman kullandığımız değişkenlerdir. Fonksiyonumuzda yaptırmak istediğimiz göreve göre parametre sayımız değişebilir.

Örneğin bir polinomu ele alalım:
P(x,y)=2x3+2x2y+4xy

Bu polinomda x ve y, P polinomu için birer parametredir. P polinomu bir fonksiyon, x ve y' de P polinonumun 2 parametresi. Fonksiyon tanımlarken kullanacağımız taslak ise şu şekilde;

function FONKSİYON_ADI ( $PARAMETRE1, $PARAMETRE2, $PARAMETRE3... ) {
// FONKSİYONDA YAPTIRACAKLARIMIZ...
return $DÖNÜŞ_DEĞERİ
}

"Dönüş Değeri?? O da ne?" dediğinizi duyuyorum... Bazen fonksiyonlarımızın üreteceği değerlere ihtiyaç duyabiliriz. Tabiki biz fonksiyona ürettiği bir değeri bize vermesini söylemezsek o da bize vermeyecektir. İşte bu ihtiyacımıza yanıt veriyor return.

Haaa, unutmadan söyleyim; return çalıştığı zaman fonksiyon işini hemen bırakıp "Evroka!!" (buldum) diye bağırıp dışarı fırlıyor... İsterse banyo yapıyor, çıplak olsun o sonucu bulmanın sevinci ve heyecanıyla herşeyi bırakıyor :)

Fonksiyonlarımız her zaman bir değer üretmek zorunda değiller. Mesela istediğimiz sayıda "Evroka!!" diye bağıran, yani çıktı veren bir fonksiyonumuz varsa, bize döneceği önemli bir değeri olmayabilir. Çeşitli programlama dilleri bu noktada bir ayrım yapmışlar, SUB veya PROCEDURE diye adlandırmışlar geri dönüş değeri olmayan fonksiyonları.

Buraya kadar herşey tamam ise, örnek vererek işe başlayalım... Örneğimiz, bahsi geçen 2 mevzuuya ithaf edilsin...

ah_su_fonksiyonlar_yok_mu_01.php
<html>
<body>
<?
echo "P(x,y)=2x<sup>3</sup>+2x<sup>2</sup>y+4xy polinomu için testler;<br>";
echo "P(10, 20)=".P(10, 20)."<br>";
echo "P(5, 3)=".P(5, 3)."<br>";
echo "P(8, -10)=".P(8, -10)."<br>";
echo "<hr>";
echo "Bir de 10 defa \"Evroka!!\" istiyoruz :)<br>";
Evroka(10);
echo "Bu kadarmış :)<br>";

function P($x, $y){
return 2*pow($x, 3) + 2*pow($x, 2)*$y + 4*$x*$y;
}

function Evroka($sayi){
for ($i=0; $i<$sayi; $i++) echo "Evroka!!<br>";
}
?>
</body>
</html>

Biliyorum, pow'u x parametresinin üssünü hesaplamak için kullandığımı farkettiniz, her farkettiğiniz şeyi söyleyecekseniz ayvayı yeriz... Biraz sessizlik istiyorum, konsantre olmaya ihtiyacım var... :)

Evet, gördüğünüz gibi fonksiyon isimleri değişkenleri gibi başlarına $ almıyorlar. "TL" alsaydı diyenleri duyar gibiyim, susun lütfen :) Ayrıca, fonksiyon isimleri, değişkenler gibi adlandırma konusunda aynı karakter kısıtlamalarına sahipler...

Bu arada bir dip not düşmek istiyorum, PHP 5'te şans eseri Türkçe değişken ve fonksiyon isimleri kullanabildiğimi farkettim, belki 4 sürümlerinde de geçerlidir, işin aslını forumda bir ara dile getiririm...

Arka sıralardan "Özyineli Fonksiyon" diye bir fısıltı duyuyorum. Ne yazık ki her dilde olduğu gibi PHP'de de var bu Özyineli Fonksiyon mereti. Recursive diye geçiyor İngilizce lugatında. Temelinde bir fonksiyonun (eğer özel olarak tanımlarsak kriteri sağlandığı sürece) kendi kendini, kendi içinden tekrar tekrar çağırması yatıyor.

Kafanızın karıştığı bu gibi noktalarda örneklerin güzel bir çözücü olduğunu bilerek hemen yer veriyorum örneğe... Bu sefer Evroka fonksiyonumuzu for döngüsü yerine bir özyineli yapıyla hazırlayalım...

ah_su_fonksiyonlar_yok_mu_02.php
<html>
<body>
<?
echo "15 defa \"Evroka!!\" istiyoruz :)<br>";
Evroka(15);
echo "Bu kadarmış :)<br>";

function Evroka($sayi){
if ($sayi>1) Evroka( --$sayi );
echo "Evroka!!<br>";
}
?>
</body>
</html>

Tanımladığımız koşula dikkat çekiyorum ilk olarak. Evroka kendisi tekrar her çağrışında $sayi'yı bir azaltıp kendisini çağırıyor. Taaa ki koşulumuz sağlanamayıncaya kadar sadece kendisini çağırıyor. Koşulumuz da $sayi 1 değerine düştüğü zaman kendisinden sonraki satırların işlenmesini sağlıyor. Yani bundan sonra fonksiyon kalan adımları işlemeye başlıyor ve "Evroka!!"ları yazmaya başlıyor. Böylece istediğimiz sayıda "Evroka!!"mız oluyor :)

Anladınız değil mi? Aferin... :)

Fonksiyonunuzun içinde kullandığınız değişkenler fonksiyon dışındaki değişkenlerden tamamen farklı oluyorlar. Biz bunlara Yerel (Local) değişkenler diyoruz. İstediğimiz kadar isimleri aynı olsun, tamamen farklıdırlar. Hatta siz fonksiyonunuz içinde dışarıdaki bir değişkeni tanımlamamış olsanızda dışarıdaki değişkene erişemezsiniz. Sanırım bunu bir örnek ile daha güzel anlatırım;


ah_su_fonksiyonlar_yok_mu_03.php
<html>
<body>
<?
$a=15;
echo "a dışarıda=".$a."<br>";
Yerel();
echo "a yeniden dışarıda=".$a."<br>";

function Yerel(){
echo "a içerde=".$a."<br>";
$a="Selam";
echo "a içerde değiştirelim=".$a."<br>";
}
?>
</body>
</html>

Çıktısı da şu şekilde:

a dışarıda=15
a içerde=
a içerde değiştirelim=Selam
a yeniden dışarıda=15

Sonuçları incelemeden önce fonksiyonumuzun parametre almadan nasıl kullanılabileceğini de gördüğümüzün altını çiziyorum. Bazen fonksiyonlarımızın parametrelere ihtiyacı olmayabilir. Hatta bazen (bu örnekteki gibi) değer dönmeyebilirler de... Gerçi bunu daha önce de söylemiştim... Tamam, bunadım biliyorum :)))) Öze dönelim lütfen...

Gördüğünüz gibi fonksiyon ve genel birbirlerinden tamamen bağımsız davrandılar. Fonksiyonu çağırdığımızda $a değişkeni yerelde tanımlı değildi ve değeri boştu. PHP ayarlarınızda uyarı mesajları aktif ise otomatik olarak bir "Warning" alırdınız bu durumda, yani tanımlanmamış bir değişkenin değerine erişmek istediğinizde.

Sonra $a'yı yerelde değiştirmeye çalıştık, değiştirdik ama genele döndüğümüzde hala eski değerindeydi. Ta-ma-men bağımsızlar...

Peki ya fonksiyon içinde genel değişkenlere ihtiyaç duyarsak?? Merak etmeyin, böyle durumlarda başvuracağımız bir arkadaşımız var: global ifadesi...

Genelde tanımlanmış bir değişkenin fonksiyon yerelinde de geçerli olmasını sağlıyor sevgili global arkadaşımız. Az önceki örneği güncellersek hem nasıl kullandığımızı da öğrenir, hem de davranışını izleriz:

ah_su_fonksiyonlar_yok_mu_03.php
<html>
<body>
<?
$a=15;
echo "a dışarıda=".$a."<br>";
Yerel();
echo "a yeniden dışarıda=".$a."<br>";

function Yerel(){
global $a;
echo "a içerde=".$a."<br>";
$a="Selam";
echo "a içerde değiştirelim=".$a."<br>";
}
?>
</body>
</html>

Çıktımız işte böyle:

a dışarıda=15
a içerde=15
a içerde değiştirelim=Selam
a yeniden dışarıda=Selam

Görüyoruz ki artık yereldeki $a da geneldekiyle aynı... Sanırım istediğimiz de oldu :)

ALINTIDIR
 
Yukarı Alt