Kategoriler
PHP

PHP’de Fonksiyon

Fonksiyon; belli bir işi yapmak için sık sık kullanılan kodların, tek bir kod bloğu altına toplanarak ihtiyaç olduğunda kod bloğunun adı ile hızlıca kullanılabildiği yapılardır.

PHP’de fonksiyonları function ifadesi ile tanımlarız. Yapısı şu şekildedir;

function fonksiyon_adi(...$parametreler){
    //fonksiyon kodları
}

Örneğin ekrana “Hello World” yazdıracak basit bir fonksiyon yazmak ve kullanmak istersek;

function hello(){
    echo "Hello World";
}

hello();

Çıktısı :

Hello World

olacaktır.

Yukarıdaki kodlamadan anlayabileceğiniz gibi fonksiyonlar tanımlandıktan sonra; kendi isimleri ve sonrasında parantez açıp kapatarak çağırılır.

PHP’de bir fonksiyon tanımlarken bilmeniz gerekenler ve uymanız gereken kurallar vardır.

  • Fonksiyon isimleri sayısal bir değer ile başlayamaz ancak sayısal bir değer (ortasında ve sonunda) içerebilir. Örneğin; fonksiyonunuzu 14fonksiyon olarak isimlendiremezsiniz ancak fonksiyon14 ya da fonksiyon14adi şeklinde isimlendirebilirsiniz.
  • Fonksiyon isimleri alfanümerik karakterlerden oluşmalıdır. Alt tire (_) dışındaki hiçbir alfanümerik olmayan karakter kullanılamaz.
  • Fonksiyon isimlerinde boşluk, noktalama işaretleri, alt çizgi “_” dışındaki her hangi bir sembol ve İngiliz alfabesi dışındaki alfabetik karakterler (ş,ç,ü,…) kullanılamaz.
  • Fonksiyon isimleri PHP tarafından kullanılan anahtar kelimelerden (new, class, const, …) oluşamaz.
  • Fonksiyon isimleri benzersiz olmalıdır. Yani PHP tarafından ya da yazılımınız içerisinde daha öncesinde tanımlanmış isimleri kullanamazsınız.
  • Fonksiyon isimleri küçük-BÜYÜK harf duyarlı değildir.
  • Fonksiyonlar kapsama / etki alanı kurallarına tabidir.

Son maddeyi biraz açmam gerekirse; fonksiyonun kod bloğu diğer kodlamalardan izole şekilde çalışır. Örneğin fonksiyon içerisindeki bir değişkeni fonksiyon kod bloğunun dışında kullanamazsınız.

//Global Kodlama Alanı
$hello = "Selam";

function hello(){
    //Yerel Kodlama Alanı
    $hello = "Hello";
    echo $hello;
}

$hello = "Merhaba";

hello();

Yukarıdaki örneğin çıktısı;

Hello

şeklindedir.

global İfadesinin Kullanımı

Global kodlama alanında tanımlanmış bir değişkeni fonksiyonun yerel kodlama alanı içerisinde de kullanmanız gerekirse global ifadesi ile değişkeni fonksiyonun yerel alanı içerisine alarak kullanabilirsiniz.

$veri = "Hello World";

function yazdir(){
    global $veri;
    echo $veri;
}

yazdir();

Çıktısı

Hello World

Yukarıdaki örnekte görebileceğiniz gibi fonksiyon kod bloğu içerisinden global ifadesini kullanarak global kodlama alanındaki $veri değişkenini fonksiyon içerisine alarak kullanabilir hale getirdim.

Ayrıca bu yöntemle global kodlama alanındaki değişkenin değeri yerel kodlama alanından değiştirilebilir.

$veri = "Global Veri";

function degistir(){
    global $veri;
    $veri = "Yerelden Tanımlanan Yeni Veri";
}

echo $veri . "\n";
degistir();
echo $veri;

Çıktısı:

Global Veri
Yerelden Tanımlanan Yeni Veri

şeklinde olacaktır.


Fonksiyonlar bir değer ya da veriyi döndüren fonksiyonlar ve hiçbir şey döndürmeyen fonksiyonlar olarak ikiye ayrılır.

Döndüren (return) Fonksiyonlar

Fonksiyonun geriye bir değer döndürdüğü fonksiyonlardır. Bu tür fonksiyonlar bir değişkene atanabilir ya da yazılım içerisinde farklı amaçlarda kullanılabilir.

Bir fonksiyonun kod bloğu içerisinde döndürülecek değeri belirtmek için return ifadesi kullanılır.

function hello(){
    return "Hello World";
}

echo hello();

Yukarıda bir değeri döndüren fonksiyon yapısını ve fonksiyonun döndürdüğü değeri ekrana basılma işlemini görebilirsiniz.

Not: Fonksiyon içerisinde return ifadesi aynı zamanda fonksiyonun çalışmasını da sonlandıracaktır.

function hello(){
    return "Hello World";
    echo "Selam Dünya";
}

echo hello();

Örneğin yukarıdaki kodlamanın çıktısı;

Hello World

şeklindedir. Fonksiyon içerisinde bir yazdırma işlemi yapmaya çalışmış olsak da PHP Yorumlayıcı daha öncesinde return ifadesini gördüğü için verilen değeri döndürdü ve fonksiyon’u sonlandırdı.

Döndürmeyen (void) Fonksiyonlar

Bazı fonksiyonlar kendisine tanımlanan işlemleri yapar ancak geriye bir şey döndürmez.

function ikinin_Karesi(){
    $hesapla = 2 ** 2;
    echo $hesapla;
}

ikinin_Karesi();

Yukarıdaki fonksiyon ekrana yaptığı işlemin sonucunun yazdırmış olsa da bir değer return etmediği yani döndürmediği için Void fonksiyondur.

Yaptığı işlemi ekrana bastırmayan ve bir değer döndürmeyen fonksiyonlarda tanımlanabilir.

function ikinin_Kubu(){
    $hesapla = 2 ** 3;
}

ikinin_Kubu();

Bu ekrana bir şey yazdırmaz ya da bir değer döndürmez. Sadece içerisindeki kod bloğunu çalıştırarak kendisinden istenilen işi yapar.


Fonksiyonda Parametreler

Bir fonksiyona dışarıdan bir değer ya da bilgi vererek verdiğiniz bu değere göre ya da değer üzerinde işlem yapabilirsiniz.

function kubuHesapla($sayi){
    return $sayi ** 3;
}

echo kubuHesapla(4) . "\n";

echo kubuHesapla(6);

Yukarıdaki örnekte kendisine verdiğimiz sayının küpünü hesaplayarak sonucu döndüren bir fonksiyon ve kullanımını görüyorsunuz. Bu kodlamanın çıktısı:

64
216

şeklindedir.

Birden Fazla Parametreli Fonksiyon Tanımlamak

Bir fonksiyon birden fazla parametre ile çalışacak ise her parametre virgül (,) ile ayrılarak belirtilmelidir.

function ussu($sayi, $ussu){
    return $sayi ** $ussu;
}

echo ussu(6, 2) . "\n";

echo ussu(7, 5);

Yukarıdaki örneğin çıktısı;

36
16807

Örnekte görebileceğiniz gibi kendisine verilen ilk parametrenin ($sayi), ikinci parametre ($ussu) ile üssünü hesaplıyor.

Parametreye Varsayılan Değer Tanımlamak

Bir fonksiyon yazılırken alacağı parametreler için varsayılan değerleri tanımlamak mümkündür. Böylece fonksiyon çağırıldığında bu parametre belirtilmezse varsayılan değeri ile hatasız çalışması sağlanır.

function ussu($sayi, $ussu = 2){
    return $sayi ** $ussu;
}

echo ussu(6) . "\n";

echo ussu(6, 4);

Çıktısı:

36
1296

Yukarıda gördüğünüz örnekte fonksiyonun ilk çağrımında ikinci parametre ($ussu) verilmediği için varsayılan olarak tanımlanan 2 kullanıldı.

Sonsuz Parametreli Fonksiyon

Bazı fonksiyonlar tanımlanırken alacağı parametrelerin miktarı farklı olabilir. Örneğin bir fonksiyona bir yerde 3 başka bir yerde 5 parametre göndermemiz gerekebilir. Bunun gibi durumlarda sonsuz parametre kabul eden fonksiyonlar tanımlanır.

Sonsuz parametreli fonksiyonlar tanımlamak için bilmeniz gereken PHP’nin dahili 3 fonksiyonu vardır.

func_num_args() : Fonksiyona gönderilen parametre sayısını döndürür.

func_get_args() : Fonksiyona gönderilen parametreleri bir dizi olarak döndürür.

func_get_arg() : Fonksiyona gönderilen parametre değerlerini bir dizi olarak kabul ederek; belirtilen anahtara ait değeri döndürmek için kullanılır.

function listele(){
    $parametre_sayisi = func_num_args();
    $parametreler = func_get_args();

    echo $parametre_sayisi . " adet parametre gönderildi.\n";

    foreach($parametreler as $row){
        echo $row . "\n";
    }
}

listele("Ahmet", "Mehmet", "Selim");

Çıktısı:

3 adet parametre gönderildi.
Ahmet
Mehmet
Selim

func_get_arg() fonksiyonlu bir kullanımda aşağıdaki şekilde yazılabilir.

function listele(){
    $parametre_sayisi = func_num_args();

    echo $parametre_sayisi . " adet parametre gönderildi.\n";

    for($i = 0; $i < $parametre_sayisi; $i++){
        echo func_get_arg($i) . "\n";
    }
}

listele("Hüseyin", "Mahmut", "Kemal", "Süleyman");

Çıktısı:

4 adet parametre gönderildi.
Hüseyin
Mahmut
Kemal
Süleyman

Referansa Bağlı Parametre Atama

Yazılımlar içerisinde nadir olarak kullanılsa da bir fonksiyona parametre olarak referansa bağlı atama işlemi yapılabilir. & sembolü ile belirtilir.

$veri = "Hello World!";

function islev(&$veri){
    echo $veri . "\n";
    $veri = "Merhaba Dünya";
    echo $veri . "\n";
}

echo $veri . "\n";
islev($veri);
echo $veri;

Çıktısı:

Hello World!
Hello World!
Merhaba Dünya
Merhaba Dünya

Kodu inceleyecek olursak;

islev ismindeki fonksiyonumuz kendisine parametre olarak gönderilen değerin referansını (RAM adresi) aldı ve ekrana referansın değerini yazdırdı. Daha sonra o referans (RAM adresi) içine yeni bir değer tanımladı.


Koşulla Fonksiyon Tanımlama

PHP’de bir fonksiyon tanımlarken belli bir koşula bağlı olarak fonksiyon yazılabilir.

$veri = "a";

if($veri == "a"){
    function veri(){
        echo "veri değişkeninin değeri a'dır.";
    }
}else{
    function veri(){
        echo "veri değişkeninin değeri a değildir.";
    }
}

veri();

Yukarıdaki örnekte görebileceğiniz gibi belli bir koşula göre bir fonksiyonun tanımlamasını yapmak mümkündür.

Böylece belli koşullarda bir fonksiyonu tanımlamak ya da tanımlamamak mümkündür.


Anonim Fonksiyonlar

Anonim (isimsiz) fonksiyonlar, bir fonksiyon adı belirtilmeden yazılmış olan fonksiyonlardır.

Yapısı ve çağırılmasına bir örnek;

$hello = function(){
    echo "Hello World";
};

$hello();

Çıktısı;

Hello World

Anonim fonksiyonların kullanım alanı son derece geniştir. Gelişmiş bir çok yazılım anonim fonksiyonları kullanır.

Anonim fonksiyonlar bir dizi içerisinde de tanımlanabilir.

$dizi = array(
    "Muhammet",
    "Şafak",
    function(){
        echo "Anonim Fonksiyon \n";
    },
    "Ahmet"
);

echo $dizi[0] . "\n";
echo $dizi[1] . "\n";
$dizi[2]();
echo $dizi[3];

Çıktısı;

Muhammet
Şafak
Anonim Fonksiyon 
Ahmet

Anonim Fonksiyonlarda Çağırılmadan Çalışan Fonksiyon

Anonim fonksiyonların bir diğer işlevsel kullanım şekli de çağırılmaya gerek duymadan sayfa yüklenirken çalışmasıdır.

($islev = function(){
    echo "Selam Dünya!";
})();

Şeklinde tanımlanırsa; $islev(); şeklinde çağırılmaya gerek duymayacak ve sayfa yüklenirken çalıştırılacaktır.


Fonksiyon Adını Değişkenden Alarak Çağırmak

Çalıştırılacak fonksiyonun adını bir değişkene tanımlayarak sonrasında bu değişken değerinde belirtilmiş olan fonksiyonu çağırmak mümkündür.

function islev_adi(){
    echo "Selam ben islev_adi fonksiyonuyum.";
}

$cagir = "islev_adi";

$cagir();

Çıktısı

Selam ben islev_adi fonksiyonuyum.

Parametreli bir fonksiyonda aynı şekilde çalıştırılabilir.

function yazdir($str){
    echo $str;
}

$cagir = "yazdir";

$cagir("Merhaba Dünya");

Çıktısı:

Merhaba Dünya

Recursive Fonksiyon

Bir fonksiyon kendi içerisinde kendisini bir döngüye girmiş gibi çağırabilir. Bu fonksiyonlara recursive fonksiyon denir.

Örneğin;

function islev($i = 1){
    echo $i . ". islev calisti.\n";
    if($i < 5){
        islev($i + 1);
    }
}

islev();

Çıktısı :

1. islev calisti.
2. islev calisti.
3. islev calisti.
4. islev calisti.
5. islev calisti.

şeklinde olur.

Burada hangi durumda fonksiyon içerisinde fonksiyonun çağırılacağını belirtmek önemlidir. Aksi halde sonsuz döngü gibi sonsuza kadar giden anlamsız fonksiyon elde edilmiş olur.


Fonksiyonda “yield” İfadesi

yield ifadesi fonksiyon içerisinden değer döndürmek için kullanılır. return ifadesinden farklı olarak yield ifadesi fonksiyonun çalışmasını durdurmaz ve değeri bir Üreteç Nesnesi olarak döndürür.

function cift_sayilar($basla, $bitir){
    for($i = $basla; $i <= $bitir; $i++){
        if($i % 2 == 0){
            yield $i;
        }
    }
}

$ciftSayilar = cift_sayilar(1, 15);

foreach($ciftSayilar as $sayi){
    echo $sayi . " çift sayıdır.\n";
}

Çıktısı:

2 çift sayıdır.
4 çift sayıdır.
6 çift sayıdır.
8 çift sayıdır.
10 çift sayıdır.
12 çift sayıdır.
14 çift sayıdır.

şeklindedir.


Çok Boyutlu (İç İçe) Fonksiyonlar

Bir fonksiyon içerisinde (yerel kodlama alanında) başka bir fonksiyonun tanımlanması mümkündür.

function islevBir(){
    
    echo "islevBir çalıştı.\n";

    function islevIki(){

        echo "islevIki çalıştı.\n";

        function islevUc(){
            echo "islevUc çalıştı.\n";
        }

    }

    function islevDort(){
        echo "islevDort çalıştı.\n";
    }

}

Yukarıdaki örnekte görebileceğiniz gibi islevIki ve islevDort fonksiyonları islevBir fonksiyonunun içerisinde tanımlanmıştır. islevUc fonksiyonu ise islevIki içerisinde tanımlanmıştır.

Kullanımı;

islevBir kod bloğu içerisinden islevIki ve islevDort çağırılabilir. Ancak islevUc mutlaka islevIki çağırıldıktan sonra çağırılmalıdır.

Global kod alanında bu fonksiyonları kullanmak içinse; hiyerarşik olarak fonksiyonlar tek tek çağırılmalıdır.

islevBir();
islevIki();
islevDort()
islevUc();

Temel mantık; islevBir çağırılmadığı sürece çalıştırılmayacağı için içerisindeki islevIki ve islevDort fonksiyonları tanımlanmamıştır. Aynı şekilde islevIki çağırılmadığı sürece islevUc tanımlanmayacaktır. Haliyle kullanılamaz.

Yazar Muhammet ŞAFAK

1992 İstanbul doğumluyum. 2008 yılından beri profesyonel olarak PHP geliştiriyorum. Her ne kadar ağırlıklı olarak PHP üzerinde çalışsam da C, C++, Python, Java programlama dillerini de kullanıyorum.

Bir Cevap Yazın