PHP/Fonksiyonlar

Vikikitap, özgür kütüphane
< PHP

Fonksiyonlar[değiştir]

Fonksiyonlar, belli işleri yapan ve programın gereken yerlerinde çağrılarak bu işleri yerine getiren kod blokları olarak tanımlanabilir. Söz dizimi şu biçimdedir:

<?php
function isim()
{
    yapılacak işler
}
?>

Görüldüğü gibi fonksiyon tanımlanırken function anahtar sözcüğü kullanılıyor ve bu anahtar sözcükten sonra fonksiyonun ismi belirtiliyor. Fonksiyonların isimlendirilmesi, değişkenlerle aynı kurallara tabidir. Bkz: Değişkenler

Şimdi, echo deyimi ile Vikikitap sözcüğünü çıktılayan yazdir isimli bir fonksiyon tanımlayalım:

<?php
function yazdir()
{
    echo "Vikikitap";
}
?>

Fonksiyonu tanımladık. Ancak fonksiyonumuz bu haliyle herhangi bir işi yerine getirmiyor. Çünkü fonksiyonu program içerisinde çağırmadık. Şimdi son satırda fonksiyonu çağıralım:

<?php
function yazdir()
{
    echo "Vikikitap";
}
yazdir();
?>

Görüldüğü gibi yazdir() söz dizimiyle, tanımlı fonksiyonumuzu son satırda çağırdık. Bu sayede fonksiyon çalıştırılacak ve ekrana Vikikitap çıktılanacaktır.

İç içe fonksiyon tanımları yapılabilir:

<?php
function mekan()
{
    echo "Vikikitap\n";
    function dil()
    {
        echo "PHP";
    }
}
?>

Burada mekan ve dil isimli iç içe iki fonksiyon tanımlandı. Şimdi bu fonksiyonları program içerisinde çağıralım.

<?php
function mekan()
{
    echo "Vikikitap\n";
    function dil()
    {
        echo "PHP";
    }
}
mekan();
dil();
?>

Programımızın son iki satırında, fonksiyonlar çağrıldı ve çalışmaları sağlandı. İç içe yapılan fonksiyon tanımlarında dikkat edilmesi gereken bir durum var. İçteki fonksiyona erişebilmek için, dıştaki fonksiyonun öncelikli olarak çağrılması gerekir. Yani:

<?php
function mekan()
{
    echo "Vikikitap\n";
    function dil()
    {
        echo "PHP";
    }
}
dil(); // hatalıdır. önce dıştaki fonksiyon çağrılmalı
mekan();
?>

global ve $GLOBALS[değiştir]

Tanımladığımız bir fonksiyonun içinde, ana betikte tanımlı bir değişkeni kullanmayı deneyelim.

<?php
$mekan = "Vikikitap";
function yazdir()
{
    echo $mekan; // hatalı
}
yazdir();
?>

Burada yazdir fonksiyonunun içinde, ana betikte tanımlı $mekan değişkenine erişmeye çalışılıyor. Ancak bu hatalıdır çünkü $mekan değişkeninin faaliyet alanı ana betiktir. PHP yorumlayıcısı yazdir fonksiyonunu çalıştırdığında ve echo $mekan komutuyla karşılaştığında, yazdir fonksiyonu içinde tanımlı bir $mekan değişkeni arar ve bulamadığı için hata verir. Ama bu, ana betikte tanımlı değişkenlere fonksiyonlardan asla erişilemez anlamına gelmiyor. Tekrar deneyelim:

<?php
$mekan = "Vikikitap";
function yazdir()
{
    global $mekan;
    echo $mekan;
}
yazdir();
?>

Şimdi yazdir fonksiyonu düzgün bir biçimde görevini yerine getirecektir. Çünkü global $mekan komutuyla, ana betikte tanımlı $mekan değişkenini kullanmak istediğimizi bildirdik. Başka bir örnek:

<?php
$a = 2;
$b = 3;
function carp()
{
    global $a;
    global $b;
    echo $a * $b;
}
carp();
?>

Bu örnekte de global anahtar sözcüğünü kullanarak ana betikte tanımlı değişkenleri carp fonksiyonu içinde çarpma işlemine soktuk.

global yerine, bir süper küresel olan $GLOBALS de kullanılabilir. Bir örnek:

<?php
$a = 2;
$b = 3;
function carp()
{
    echo $GLOBALS["a"] * $GLOBALS["b"];
}
carp();
?>

Bu örnek de bir öncekiyle aynı işi yapıyor ancak bu sefer $GLOBALS süper küreseli kullanıldı.

Fonksiyon içinde tanımlı değişkenlerin faaliyet alanı, fonksiyon bloğu ile sınırlıdır. Yani:

<?php
function bilgi()
{
    $mekan = "Vikikitap";
    echo $mekan;
}
echo $mekan; // hatalı. $mekan değişkenine erişemez
?>

Örnekte bilgi fonksiyonunda tanımlı $mekan değişkenine fonksiyon dışından erişilmeye çalışıyor ancak fonksiyon dışından $mekan değişkenine erişilemez.

Parametre alan fonksiyonlar[değiştir]

Fonksiyonlara, çağrıldıkları anda bazı değerlerin gönderilmesi ve bu değerlerin fonksiyon içinde kullanılması istenebilir. Parametreler, fonksiyon isminden sonraki parantezlere yazılır.

<?php
function topla($deger1, $deger2)
{
}
?>

Yukarıda ismi topla olan, aynı zamanda $deger1 ve $deger2 isminde iki adet parametre alan bir fonksiyon tanımlandı. Şimdi bu fonksiyonu program içerisinde çağıralım.

<?php
function topla($deger1, $deger2)
{
    $sonuc = $deger1 + $deger2;
    echo $sonuc;
}
topla(2, 3);
?>

Son satırda fonksiyon çağrılırken, 2 ve 3 değerleri parametre olarak gönderildi. Yani $deger1 parametresi 2 değerini alırken $deger2 parametresi de 3 değerini aldı ve bu değerler daha sonra fonksiyon içerisinde kullanıldı.

Parametre alan fonksiyonlar çağrılırken parametre sayısına uygun olarak değer gönderilmesi gerekir. Örneğin:

<?php
function topla($deger1, $deger2)
{
    $sonuc = $deger1 + $deger2;
    echo $sonuc;
}
$a = 2;
$b = 3;
topla($a); // hatalı
?>

Bu hatalıdır çünkü topla fonksiyonu iki parametre alırken, çağrıldığı esnada yalnızca bir değer gönderiliyor.

Parametrelerin uygun sayıda gönderilmesi kadar, parametrelere uyan değerlerin gönderilmesi de önemlidir. Örneğin:

<?php
function bilgi($nerdeyiz, $konumuz)
{
    echo "Mekan: {$nerdeyiz}<br>";
    echo "Konu: {$konumuz} Programlama Dili";
}
bilgi("PHP", "Vikikitap");
?>

Örnekte parametre olarak aldığı iki değeri ekrana çıktılayan bir fonksiyon tanımlandı ve programın son satırında parametre olarak "PHP" ve "Vikikitap" değerleri gönderildi ve fonksiyon çağrıldı. Fonksiyonun çıktısını inceleyelim:

Mekan: PHP
Konu: Vikikitap Programlama Dili

Görüldüğü gibi, parametrelere uyan değerler gönderilmediği için çıktı da olması gerektiği gibi olmadı.

Fonksiyon parametrelerine öntanımlı değerler verilebilir. Örneğin:

<?php
function bilgi($nerdeyiz, $konumuz = "PHP")
{
    echo "Mekan: {$nerdeyiz}<br>";
    echo "Konu: {$konumuz} Programlama Dili";
}
bilgi("Vikikitap");
?>

Burada $konumuz parametresine öntanımlı olarak "PHP" değeri verildi. Bu parametre öntanımlı değere sahip olduğundan son satırda fonksiyon çağrılırken yalnızca $nerdeyiz parametresinin alacağı değer gönderildi.

Çıktısı:

Mekan: Vikikitap
Konu: PHP Programlama Dili

Başka bir örnek:

<?php
function bilgi($nerdeyiz, $konumuz = "PHP")
{
    echo "Mekan: {$nerdeyiz}<br>";
    echo "Konu: {$konumuz} Programlama Dili";
}
bilgi("Vikikitap", "C#");
?>

Bu örnekte ise $konumuz parametresinin öntanımlı değeri yerine fonksiyon çağrılırken "C#" değeri gönderildi. Fonksiyon çağrılırken değer gönderildiği için $konumuz parametresi öntanımlı değerini değil "C#" değerini kullanacaktır.

Çıktısı:

Mekan: Vikikitap
Konu: C# Programlama Dili

Öntanımlı değer alan parametrelerin, öntanımlı değeri olmayan parametrelerden sonra yazılması gerekir. Aksi durumda bu bir karışıklığa yol açar. Yani:

<?php
function bilgi($konumuz = "PHP", $nerdeyiz)
{
    echo "Mekan: {$nerdeyiz}<br>";
    echo "Konu: {$konumuz} Programlama Dili";
}
bilgi("Vikikitap");
?>

Çıktısı:

Warning: Missing argument 2 for bilgi(), called in dosya.php on line 7 and defined in dosya.php on line 2

Notice: Undefined variable: nerdeyiz in dosya.php on line 4
Mekan:
Konu: Vikikitap Programlama Dili

$konumuz parametresinin öntanımlı değerini kullanacağımız için değer göndermedik. $nerdeyiz parametresinin değeri olan "Vikikitap" değerini gönderirken PHP yorumlayıcısı $konumuz parametresinin değerini gönderdiğimizi sandı ve bu bir karışıklığa neden oldu.

Parametreleri gönderimli aktarma[değiştir]

Parametre olarak aldığı değişkenin değerini karesiyle değiştiren bir fonksiyon tanımlayalım.

<?php
function kare($deger)
{
    $deger *= $deger;
}
$sayi = 5;
kare($sayi);
?>

Buraya kadar her şey tamam. Şimdi ana betikte, fonksiyonu çağırdıktan sonra ana betikteki $sayi değişkeninin değerine bakalım.

<?php
function kare($deger)
{
    $deger *= $deger;
}
$sayi = 5;
kare($sayi);
echo $sayi; // 5 çıktılar
?>

Fonksiyon içerisinde karesiyle değiştirmemize rağmen $sayi değişkeni hala 5 değerini tutuyor. Şimdi fonksiyon tanımında $deger parametresini gönderimli hale getirip tekrar deneyelim.

<?php
function kare(&$deger) // $deger artık gönderimli
{
    $deger *= $deger;
}
$sayi = 5;
kare($sayi);
echo $sayi; // 25 çıktılar
?>

Görüldüğü gibi $sayi değişkeni artık 25 değerini tutuyor çünkü $deger parametresi gönderimli olarak tanımlandı. İlgili olarak bkz: Değişkenlerde gönderimli atama

Değer döndüren fonksiyonlar[değiştir]

Bir fonksiyondan geriye değer döndürmek için return deyimi kullanılır.

<?php
function kare($deger)
{
    return $deger * $deger;
}
$sayi = 5;
$sayi = kare($sayi);
echo $sayi; // 25 çıktılar
?>

kare fonksiyonu bir parametre alıyor ve aldığı parametreyi kendisiyle çarparak işlem sonucunu döndürüyor. Örnekte 5 değerli $sayi değişkeni tanımlandı. Daha sonra $sayi değişkeni kare fonksiyonuna parametre olarak gönderildi ve dönen değer $sayi değişkenine atandı. Başka bir örnek:

<?php
function birlestir($deger)
{
    $sonuc = $deger . " Programlama Dili";
    return $sonuc;
}
$dil = birlestir("PHP");
echo $dil; // PHP Programlama Dili çıktılar
?>

return deyimi yalnızca değer döndürmek için değil, fonksiyonun çalışmasını durdurmak için de kullanılabilir. Örneğin:

<?php
function mekan($mekan)
{
    if($mekan != "Vikikitap")
    {
        return;
    }
    echo $mekan;
}
?>

Burada $mekan parametresinin değeri "Vikikitap" değilse; fonksiyonun çalışması duracak, geri kalan kısım işleme konmayacak ve geriye NULL değer dönecektir.

Öntanımlı değere sahip parametreler de gönderimli aktarılabilir.

Değişken fonksiyonlar[değiştir]

Bir değişken isminin sonunda parantezler varsa değişkenin tuttuğu değerle aynı isimde bir fonksiyon aranır ve çalıştırılır. Örneğin:

<?php
function fonk()
{
}
$degisken = "fonk";
$degisken(); // fonk() çağrılır
?>

Başka bir örnek:

<?php
function fonk($param)
{
}
$degisken = "fonk";
$degisken("bir değer"); // fonk("bir değer") çağrılır
?>

Değişir sayıda parametre alan fonksiyonlar[değiştir]

Parametre olarak gönderilen değer sayısı, her çağrılışta değişen fonksiyonlar da tanımlanabilir.

<?php
function fonk()
{
    echo "Parametre sayısı " . func_num_args() . "<br>";
    echo "Birinci parametre: " . func_get_arg(0). "<br>";
    echo "İkinci parametre: " . func_get_arg(1). "<br>";
    echo "Üçüncü parametre: " . func_get_arg(2). "<br>";
}
fonk("a", "b", "c");
?>

Çıktısı:

Parametre sayısı 3
Birinci parametre: a
İkinci parametre: b
Üçüncü parametre: c

func_num_args() işlevi, parametre olarak aktarılan değerlerin sayısını döndürür. func_get_arg(n) işlevi ise, gelen parametlerden n'inci sıradakinin değerini döndürür.

func_get_args() işlevi ise, alınan parametreleri bir dizi olarak döndürür.

<?php
function fonk()
{
    foreach(func_get_args() as $deger)
    {
        echo $deger;
    }
}
fonk("a", "b", "c");
?>

İlgili olarak bkz: Diziler ve foreach döngüsü

Statik değişkenleri kullanmak[değiştir]

Kaçıncı kez çağrıldığı hakkında bilgi veren bir fonksiyon örneği:

<?php
function fonk()
{
    static $say = 0;
    $say++;
    echo "{$say}. kez çağrıldı<br>";
}
fonk();
fonk();
fonk();
?>

Çıktısı:

1. kez çağrıldı
2. kez çağrıldı
3. kez çağrıldı

Görüldüğü gibi static olarak tanımlanan değişkenler, fonksiyon bloğu sonlansa bile mevcut değerlerini koruyor.

function_exists() işlevi[değiştir]

Bir fonksiyonun tanımlı olup olmamasına göre mantıksal bir değer döndürür.

<?php
function fonk1()
{
    echo "fonk1 çağrıldı<br>";
}

if(function_exists("fonk1"))
{
    echo "fonk1 tanımlı<br>";
}
else
{
    echo "fonk1 tanımsız<br>";
}

if(function_exists("fonk2"))
{
    echo "fonk2 tanımlı";
}
else
{
    echo "fonk2 tanımlanıyor<br>";
    function fonk2()
    {
        echo "fonk2 çağrıldı<br>";
    }
    echo "fonk2 tanımlandı<br>";
}

fonk1();
fonk2();
?>

Çıktısı:

fonk1 tanımlı
fonk2 tanımlanıyor
fonk2 tanımlandı
fonk1 çağrıldı
fonk2 çağrıldı

get_defined_functions() işlevi[değiştir]

Tanımlı fonksiyonları bir dizi olarak döndürür.

<?php
function topla($a, $b)
{
    return $a + $b;
}

function carp($a, $b)
{
    return $a * $b;
}

$tanimlilar = get_defined_functions();
var_dump($tanimlilar);
?>

Çıktısı:

array(2) {
  ["internal"]=>
  array(1425) {
    [0]=>
    string(12) "zend_version"
    [1]=>
    string(13) "func_num_args"
    [2]=>
    string(12) "func_get_arg"
    [3]=>
    string(13) "func_get_args"
    [4]=>
    string(6) "strlen"
    ...
    ...
    ...
    [1422]=>
    string(32) "xmlrpc_parse_method_descriptions"
    [1423]=>
    string(36) "xmlrpc_server_add_introspection_data"
    [1424]=>
    string(45) "xmlrpc_server_register_introspection_callback"
  }
  ["user"]=>
  array(2) {
    [0]=>
    string(5) "topla"
    [1]=>
    string(4) "carp"
  }
}

internal indisinin alt dizisi, mevcut PHP fonksiyonlarını içerirken, user indisinin alt dizisi kendi tanımladığımız fonksiyonları içerir.