Fonksiyonlar

26 Mayıs 2008 Pazartesi

Belirli bir işlemi gerçekleştirmek için çağrı yapan bir arabirim gerektiren ve seçime bağlı olarak bir sonuç döndüren kod modülüne fonksiyon diyoruz. Tek ve kesin bir işlemi gerçekleştiren kodları ayırmaya, kodun okunmasını kolaylaştırmaya, aynı işlemi tekrarlamak gerektiğinde kodu yeniden kullanmamıza olanak sağlarlar.
Php'de fonksiyonları 2 temel grupta toplamak olasıdır.
1- Php'nin kendi yerleşik fonksiyonları.
2- Kullanıcı tanımlı fonksiyonlar.

Bir fonksiyonu çağırırken kullandığımız genel yol ;

function(parametre1, parametre2, ...) ;

gibidir. Eğer parametre gerektirmeyen bir fonksiyona başvuruyorsak çağrımız;

function_ismi();

biçiminde olacaktır. Bu biçimde çağrılan bir fonksiyondan değer döndürmesi beklenmez. Örneğin sunucumuzda yüklü php bileşenleri için bilgi almamızı sağlayan phpinfo(); fonksiyonu bu tür fonksiyonlardandır. Bir parametre almadığı gibi genellikle döndürdüğü değeri dikkate almayız.
Parametre gerektiren fonksiyonumuza çağrı yaparken parametreyi veriyi saklayan bir değişken veya veri ile fonksiyon adından sonraki parantezler içerisine yerleştirerek geçiririz.

$karaktersay = strlen("mehmet);

Örneğimizde mehmet verisinin sahip olduğu karakter verisini öğrenmek amacıyla php' nin yerleşik fonksiyonu olan strlen(); fonksiyonuna parametre olarak mehmet adını geçirdik.
Bir fonksiyona parametre geçirmekle, ham veriden stringe stringten bir diziye kadar bir çok veri kalıbını değerlendirmeye alırız. Parametreler herhangi bir veri tipinde olmakla bazı fonksiyonlar özel veri tioleri gerektirir. Bir fonksiyonun kaç parametre aldığını, bunların nleri temsil ettiğini, ne tür veri tipi ile işlem yaptığını anlamak için fonksiyonun prototiplerinden yararlanırız. strlen(); fonksiyonunun prototipine bakalım. http://tr2.php.net/manual/en/function.strlen.php

int strlen ( string $string );

Prototibi incelediğimizde fonksiyon adından önce gelen int sözcüğü, bu fonksiyonun bir tam sayı döndüreceğini gösterir. Fonksiyonun alacağı parametreler ise parantezin içindedir.

Php fonksiyon adlarına yapılan çağrılarda, değişkenler gibi büyük küçük harf ayrımına duyarlı değildir. Php' de function_iSMi(); ile function_ismi(); yazmak arasında bir fark yoktur.

Kullanıcı tanımlı fonksiyonlar;

Halihazırda php'nin yerleşik fonksiyonları ile bir çok işlemimizi yapabiliriz. Ancak bazen bu bize yeterli olmaz. Hazırladığımız betiklerde, bir çok kez kullanmak istediğimiz kod parçaları yazıyorsak, bunları tekrar tekrar yeniden yazmak yerine, bir fonksiyon olarak tanımlama, gerektiğinde bu fonksiyona başvurarak işlemlerimizi yapmak, işimizi hem oldukça kolaylaştıracak,hem zaman kazandıracak hem de yazdığımız kodların daha hızlı ve tutarlı çalışmasını sağlayacaktır.

- Temel yapı;

Php' de bi fonksiyon bildirmek, yeni bir fonksiyon yaratmamıza neden olur. Bildirme işlemi anahtar sözcük function ile başlar. Bu bildirimin ardından fonksiyonumuzun adını, gereken parametreleri, ve bu fonksiyonun çağrılması durumunda çalıştırılacak kodu bildiririz.

function fonksiyonum()
{
print "Ben çağrıldım vede ahanda burdayım.";
}
print fonksiyonum();
Bu fonksiyonu çağırmak, tarayıcıda "Ben çağrıldım vede ahanda burdayım." ifadesinin yansıtılmasına neden olur.

Php'de yerleşik olan fonksiyonlara tüm php scriptlerinde erişebilir onlarla işlem yapabiliriz. Ancak kendi tanımladığımız fonksiyonlara sadece içinde bildirdiğimiz program boyunca erişebilir onlarla yapacağımız işlemleri sadece o program içerisinde gerçekleştirebiliriz.
Fonksiyonumuz içerisinde kullandığımız süslü parantezler, ihtiyaç duyduğumuz işi gerçekleştirecek kodu kapsar. Bu parantezlerin içinde, başka fonksiyonlara yaptığımız çağrılar, yeni fonksiyonların veya değişkenlerin bildirimleri, düz HTML kodları, farklı dosyaları ithal etmek gibi bir php scripti içinde geçerli olan her şey bulunabilir. Bir fonksiyon içerisinde, php'den çıkıp düz HTML kodu yazmak istersek, Php fonksiyon yapısı buna da olanak sağlar. Bunun için php kapanış etiketi olan ?> ile php'den çıkılır ve düz HTML etiketlenmesine devam edilir. Ardından yeniden php başlangıç etiketi açılarak <?php kalan php işlemleri yapılır ya da fonksiyon kapatılır.

<?php
function fonksiyonum()
{
?>
Ben Çağrıldım ve işte burdayım
<?php
}
print fonksiyonum();
?>

Bu örneği print fonksiyonum(); satırını kaldırarak ta deneyiniz.

- Fonksiyonları adlandırmak;

Fonksiyonlarımızı isimlendirirken, vereceğimiz fonksiyon adının, kısa ama açıklayıcı olduğuna dikkat edersek bu ileride karşılaşacağımız olması muhtemel hataların önüne daha hata olmadan geçmiş olur. Bununla birlikte php' de fonksiyon tanımlarken uymamız gereken bir kaç basit kural daha var.
- Fonksiyonumuzun adı, php'de önceden tanımlı yada daha önce kendimizin tanımlamış olduğu fonksiyon adı ile aynı olamaz.
- Kullanacağımız fonksiyon adlarında, sadece harfler, sayılar ve alt çizgiler bulunabilir.
- Fonksiyon adları bir sayı ile başlayamaz.

function ismi()
function ismi2()
function ismi_getir()
function _ismi()

Geçerli fonksiyon tanımlarıdır ama;

function 1_ismi()
function ismi-bir()
function phpinfo()
function strlen()

Bu tür fonksiyon tanımlamalar php için geçerli değildir.

- Parametreler;

Parametrenin tanımı; Çağrıldığında bir fonksiyona verilen ve bu fonksiyon çağrıldığında elde edilecek sonucu etkileyen bilgiler ya da verilerdir. Bir çok fonksiyonun işini yapabilmesi için, bir yada birden fazla parametreye ihtiyacı vardır ve parametreler bir fonksiyona veri geçirebilmemizi sağlarlar. Aşağıda geçirdiğimiz parametrenin karesini döndüren bir fonksiyon yapısı örneklenmektedir.

<?php
function kare($x)
{
return $x * $x;
}

print '5 in karesi'. kare(5). 'tir';
?>

Örneğimizde ilk önce function bildirimi ile bir fonksiyon tanımlayacağımızı bildirdik ve ardından fonksiyon adımız olan fonksiyonum' u yazdık. Ardından fonksiyonumuzun alacağı parametreyi parantezler arasında bildirdik. ardından kod bloğumuzu açarak, fonksiyonumuzun döndürmesini istediğimiz değerin işlemini bildirdik ve kod bloğumuzu kapattık. Daha sonra fonksiyonumuzun dışından tarayıcımızda karesini yansıtmak istediğimiz sayıyı fonksiyonumuzu çağırıp parametre olarak işlenecek değer olması için paranteslerin içine girdik ve tarayıcımızın " 5 in karesi25tir" ifadesini yansıtmasını sağladık. Örneğimizi farklı sayılar deneyerek geliştirebilirsiniz. Örneğimizde kullandığımız return ifadesi, bir fonksiyonun değer döndürülmesi isteniyorsa kullanılır. Bu değer fonksiyonun yaptığı işlemin sonucu olabileceği gibi, o işleme bağlı olarak true ya da false olarak bir boolean değer olabilir.
Şimdi 1'den verdiğimiz parametre ye kadar olan sayıların toplamını oluşturan bir kod parçası tasarlayalım.

<?php
function toplam($x)
{
$toplam = 0;
for($i = 1; $i <= $x; $toplam += $i, $i++);
return $toplam;
}
print '1 den 5 e kadar olan sayıların toplamı' .toplam(5).' tir';
?>

Kodumuzu toplam fonksiyonu olarak tanımlayıp parametre olarak verebileceğimiz her hangi bir rakamı temsil eden $x parametresini bildirdik. kod bloğumuzun içinde döngüden önce bir başlangış değeri saptadık. ardından bir for döngüsü ile 1' den verdiğimiz parametre değeri kadar sayacımızın çalışmasını ve ardından elde ettiği değeri toplayarak, $toplam adlı değişkende depolamasını ve döngümüzün koşulu yerine getirildiğinde bu değişken içinde depolanan değeri return ifadesiyle fonksiyonumuzun çıktısı olarak bize göndermesini bildirdik. Fonksiyonumuzu print deyimi ile çağırdığımızda verdiğimiz 5 sayısını parametre olarak alıp bize 1'den 5' e kadar olan sayıları toplayıp yansıttığını gördük.

- Fonksiyonlarda kapsam;

Fonksiyonlarda değişken kapsamı farklı davranışlar gösterir. Bir değişkenin kapsamı, o değişkenin nerelerde görünür ve kullanılabilir olduğunu belirler. Php'de değişkenlerin kapsamını belirleyen bir kaç kural vardır.

- Bir fonksiyonda bildirilen değişkenler, içinde bildirilmiş oldukları deyimden fonksiyonun sonundaki kapatma parantezine kadar geçerlidirler. Buna fonksiyonun kapsamı denir. Bu tip değişkenler ise yerel değişkenler olara bilinir.
- Fonksiyonların dışında bildirilen değişkenler, içinde bildirilmiş oldukları deyimden, dosyanın sonuna kadar geçerlidir. Ancak fonksiyonların içerisinde geçerli olamazlar. Buna genel(global) kapsam adı verilir. Bu tür değişkenler ise global değişkenler olarka bilinirler.

<?php
function fonk()
{
$deg = 2;
}
$deg = 1;
fonk();
print $deg;
?>

Fonksiyonumuz çağrıldığında $deg değişkeninin değerinin 2 ye ayarlandığına, ama bu değişimin fonksiyon içindeki $deg değişkeni ile sınırlı kaldığına, çıktımızın genel değişken olan 1 e ayarlı olarak tarayıcıya yansıttığına dikkat ediniz.
Eğer fonksiyon içerisinde aynı adlı değişkemizin fonksiyonumuz tarafından işlenmesini istiyorsak $GLOBALS [] anahtar sözcüğünü kullanarak değişkenimizi programımızın tamamı için genel hale getirebiliriz.

<?php
function fonk ()
{
$GLOBALS["deg"] = 2;
}
$deg = 1;
fonk();
print $deg;
?>


Global anahtar sözcüğü kullanıldığında, $deg değişkenimiz fonksiyon çağrıldıktan sonra fonksiyonun dışındada varlığını sürdürecektir. Artık kodumuz $deg değişkenini 2 olarak yorumlayabilir. Global anahtar sözcüğünümkullanarak, bir değişkeni tüm program boyunca kapsam içerisinde tutabiliriz.

- require ve include deyimleri kullanmak, kapsamı etkilemez. Eğer deyim bir fonksiyonun içindeyse, fonksiyon kapsamı geçerlidir. Eğer fonksiyon dışındaysa genel kapsam içindedir.
- Değişkenler, unset() fonksiyonu çağrılarak silinebilirler. Bir değişken bu fonksiyon kullanılarka silindiyse artık kapsamda değildir.

- Bir fonksiyona referansla veya değerle parametre geçirmek;

Fonksiyon parametrelerinin normal çağrılma yoluna, "değerle parametre geçirmek" adı verilir. Fonksiyona bir parametre geçirdiğimizde, geçirilen değeri içeren yeni bir değişken yaratılır. Bu değişken orjinal değişkenin bir kopyasıdır. Ancak bu değişkenin değeri fonksiyon içinde yaptığı işleme göre farklı, fonksiyon dışında ise ilk tanımlandığı haliyle farklı olur. Fonksiyonların kapsam kuralları gereği, global anahtar sözcüğünü kullanmadığımız sürece bu durum böyledir. Global anahtar sözcüğü kulanmak ise bazen sıkça tercih edeceğimiz bir yol olmayabilir. Eğer programınızı farklı sayfalara bölmüş yada modüle rbir biçimde tasarlamışsanız, muhtemelen çalışması bitmiş olan değişkenleri bellekten silmek isteyeceksiniz. Belkide bir değişkenin tüm programınız boyunca global kapsam içerisinde kalmasını tercih etmeyeceksiniz. İşte bu tür durumlarda, uygulamak isteyeceğiniz yol, en kolay yol olarak fonksiyonunuza parametre geçirerek çıktı üretmek olacaktır. Aşağıdaki kodu incelerseniz, bunun bazen oldukça karmaşıklaşabildiğini göreceksiniz.

<?php
function ekle($eklenen, $deger = 1)
{
$eklenen = $eklenen + $deger;
}

$eklenen = 10;
ekle($eklenen);
print $eklenen
?>

Kod parçamızın çıktısının verdiğimiz parametre değeri ile aynı yani 10 olarak kaldığını göreceksiniz. Bunun nedeni kapsam kurallarıdır. Kodumuz $eklenen adında 10 değerini içeren bir değişkeni yaratır ve ardından ekle adlı fonksiyonu çağırır. Fonksiyon içinde yaratılan 10 değerli değişkene 1 değeri eklenir ve $eklenen değişkeninin değeri, fonksiyonun yapısı boyunca 11 olarak saklanır. Bu fonksiyonu çağıran koda döndüğümüzde $eklenen adlı değişkenimiz genel kapsam içerisinde ve bambaşka bir değişkendir. Fonksiyon içindeki $eklenen değişkeni genel kodumuz içindeki $ekle değişkeni ile kopya olmasından başka hiç bir benzerliği yoktur. İşte bu yüzden de $eklenen değişkenimizin değeri 11 olarak değişmemiştir.

Parametreyi referansla geçirmek çok daha kolay ve daha sade bir yoldur. Parametre bir fonksiyona geçirildiğinde, fonksiyonun yeni bir değer yaratmasını sağlamaktansa, orjinal değişkeni gösteren bir referans işaretiyle fonksiyona dahil olur. Bu değişkeninde normal değişkenler gibi $ işaretiyle belirlenen bir işareti vardır ve diğer değişkenlerle aynı biçimde kullanılabilirler. Ancak, bu değişkenin kendi değeri yoktur ve sadece orjinalinin bir referansıdır. Bu referans değişkende yaptığımız her değişiklik orjinal değişkeni de direkt olarak etkiler. Parametrenin referansla geçirme işleminde kullanılacağını önüne bir & (ampersand - ve-) işareti koyarak bildiririz. Bu parametremiz fonksiyon tanımlamada kullandığımız parantezlerin içerisinde olur. Böylelikle fonksiyonumuzda ek bir değişikliğe de gitmemize gerek kalmaz.

Yukarıdaki kod parçamızı, parametremizi referansla geçirerek yeniden düzenlersek;

<?php
function ekle(&$eklenen, $deger = 1)
{
$eklenen = $eklenen + $deger;
}

$eklenen = 10;
print $eklenen. "
";

// Referansla geçirilmiş hali
ekle($eklenen);
print $eklenen // Artık değişkenimiz 11 değerine sahip
?>

Parametreleri bir referans ile geçirme işlemimizin sonucu ekran çıktılarımızda net bir biçimde görülecektir. Referansla değer geçirmenin bir avantajı da, fonksiyon ile çağrılan değişken üzerinde değişiklikler yapabilmemizdir.

<?php
function kare_al(&$deger)
{
$karesi = $deger * $deger;
$deger = $karesi;
}
$veri = 10;
kare_al($veri);
print $veri;
?>

Örneğimizde, $veri değişkenine ilk önce 10 değeri atanmış, sonra da kare_al fonksiyonunu $veri parametresi ile çağrılmıştır. Fonksiyonumuz, &$deger biçiminde referansla parametre aldığından, $veri değişkeni ile $deger parametresi bilgisayarın aynı hafıza alanını kullanacaktır. Bu yüzden fonksiyon parametresi $deger değişkeni üzerinde yapılacak olan her değişiklik, $veri değişkenimizide yetkileyecektir. Kod parçamızda $veri değişkenimizin değerinin 10 olmasına rağmen, fonksiyon çalıştırıldığında $veri değişkenimizin değeri 100 olacaktır.

Gönderen _nl2br zaman: 01:40  

0 yorum:

Yorum Gönder