Php ile bir proje geliştirdiğimizde php bize binlerce hazır fonksiyon sunmaktadır. Bir çok programcı hazır fonksiyonların yeterli gelmediği durumlarda kendi fonksiyonlarını oluşturmaktadır. Oluşturduğumuz bu fonksiyonlar zamandan tasarruf etmemizin yanı sıra gereksiz kod tekrarını da önleyecektir. Php fonksiyon tanımlamanın kalıbı aşağıdaki gibidir.
<?php function fonksiyon_adi ($parametre1, $parametre2, ...){ // yapılacak işlemler } ?>
Php fonksiyon tanımlamaları genellikle bu kalıba göre yapılmaktadır. Fonksiyonun dışarıdan alacağı değerler (parametreler) fonksiyonun yapacağı işe göre değişebilmektedir. Aşağıda çok basit bir örnek ile fonksiyon tanımlama işlemini inceleyebilirsiniz.
<?php function topla($sayi1, $sayi2){ echo $sayi1 + $sayi2; } topla(2,4); // sonuç 6 ?>
Yazdığımız fonksiyonların bazı durumlarda geriye değer döndürmesi gerekebilir. Fonksiyonların geriye değer döndürebilmesi için return özelliğini kullanıyoruz. Geriye değer döndüren fonksiyonlarda sonucu istediğimiz gibi kullanabiliriz. Yukarıdaki örnekte geriye değer döndürmeyen bir fonksiyon hazırladık. Bu fonksiyon içerisinde echo komutu ile sonucu direk ekrana yazdırdığımız için sonucu dönen değeri tekrar kullanabilmemiz mümkün olmuyor.
<?php function topla($sayi1, $sayi2){ return $sayi1 + $sayi2; } topla(2,4); ?>
Yukarıda tanımladığımız geriye değer döndüren fonksiyonumuzda sadece toplama işlemi yapılacak. Ekrana yazdırma komutu vermediğimiz herhangi bir çıktı elde etmeyeceğiz. Aşağıdaki örnekte yine geriye değer döndüren fonksiyon tanımlıyoruz. Bu sefer fonksiyonun döndürdüğü değerleri tekrar işleyerek sonucu ekrana yazdırıyoruz.
<?php function topla($sayi1, $sayi2){ return $sayi1 + $sayi2; } echo topla(2,4) + topla (3,5) + topla (3,2); ?>
Fonksiyon tanımlarken dikkat etmemiz gereken önemli bir husus ise parametrelerdir. Yukarıdaki fonksiyonumuzun 2 adet parametre alacağını belirttiğimiz için 2 adet parametrenin girilmesi zorunludur. Parametrelerden herhangi bir tanesi eksik olursa program akışı hata verecektir.
Php fonksiyon tanımlarken parametreleri isteğe bağlı yapmak mümkündür. Fonksiyonun yapacağı işleme göre bir yada daha fazla parametreyi zorunlu olmaktan çıkarabiliriz. Bu duruma varsayılan parametre denilmektedir. Fonksiyon tanımlarken girdiğimiz parametreye değer vererek varsayılan değer tanımlaması yaparız. Parametre değeri gönderilmediğinde varsayılan değer işleme alınır ve program akışı devam eder.
<?php function topla($sayi1, $sayi2 = 0){ return $sayi1 + $sayi2; } echo topla(1); ?>
Yukarıdaki örnekte 2 parametreli topla isimli bir fonksiyon tanımladık ancak sayi2 parametremize varsayılan olarak 0 değerini atadık. Bu durumda topla fonksiyonumuza sadece sayi1 için 1 değerini gönderdiğimiz için 1 + 0 işleminin sonucu olarak ekranda 1 yazdırılacaktır.
Bazı durumlarda fonksiyonlarımızın içerisinde fonksiyonun dışında tanımlamış olduğumuz bir değişkeni kullanma ihtiyacı meydana gelmektedir fakat fonksiyon içerisinde dışarıdaki bir değişkene erişilememektedir. Bu durumda devreye global değişkenler girer. Aşağıdaki örnekte topla fonksiyonumuzun dışarısında tanımladığımız sayi1 değişkenini global olarak fonksiyon içinde tanımlıyoruz ve kullanıyoruz. Fonksiyonumuzu çalıştırdığımızda ekrana 7 sonucunu verecektir. Birden fazla global değişken tanımlamamız gerektiğinde virgül ile ayırarak tanımlama yapabiliriz.
<?php $sayi1 = 5; function topla($sayi2){ global $sayi1; //global $sayi1, $sayi2 , $sayi3...; return $sayi1 + $sayi2; } echo topla(2); ?>
İç İçe Fonksiyon Kullanımı
<?php function topla($sayi1, $sayi2) { function carp($sayi1, $sayi2) { echo 'Çarpım : ' . ($sayi1 * $sayi2); } echo 'Toplam : ' . ($sayi1 + $sayi2) . '<br/>'; carp($sayi1, $sayi2); } topla(3, 2); ?>
Kendi Kendini Çağıran (Recursive) Fonksiyon
Recursive fonksiyonların sınırsız kategori listeleme örneklerinde sıkça görebilirsiniz. Tüm ana kategori ve alt kategorileri listelemek için recursive fonksiyonlar kullanılmaktadır.
<?php $a = 1; function faktoriyel($sayi) { global $a; if ($sayi > 1) { $a = $a * $sayi; $sayi--; faktoriyel($sayi); } return $a; } echo '5 faktoriyel = '.faktoriyel(5); ?>