Fonksiyonlar


    × Bunları biliyor muydunuz?
"Başlangıç kontrolcüsü üzerinden $this nesnesini data olarak göndererek statik olmayan sınıflara ilgili data üzerinden erişebilirsiniz."


Fonksiyonların temel görevi belli bir işi yapan kodları derleyip benzer durumlarda aynı kodları tekrar yazmayı gerektirmeden yeniden kullanabilmeyi sağlamaktır. Yani bir kodu bir kez yaz tekrar tekrar kullan mantığı vardır. Mesela tüm projelerinizde veritabanı bağlantıları kullanıyorsunuz. Her bir projede aynı kodları tekrar yazmak çokta akıllıca bir yol değildir. Böyle bir yol ciddi zaman kayıplarına neden olacaktır. Bunun yerine veritabanı bağlantı kodlarınız bir kez fonksiyon haline getirip projelerinizde kullanabilirsiniz. Veya aynı proje içerisinde aynı kodu birden fazla kullanmanız gereken zamanlar olduğunda bu kodları tekrar yazmak yerine bir kez fonksiyon haline getirip o kodlar yerine fonksiyonun kendisini kullanabilirsiniz. Fonskiyonlar genel olarak ön tanımlı ve kullanıcı tanımlı olmak üzere 2'ye ayrılırlar. Bu bölümde kullanıcı tanımlı fonksiyonları ele alacağız.

 

 

# Bölüm Başlıkları


# Fonksiyon Nasıl Tanımlanır?

Fonksiyon Tanımlama Kuralları
Tanımlanan Fonksiyonu Kullanma

# Parametre Gönderimi

Sınırsız Parametre Gönderimi
Referans Parametre Gönderimi
Parametrelerde Tür Dayatması 

# Değer Döndürme

Dönen Değere Tür Dayatması

# Değişken Etki Alanı

$GLOBALS Süper Küreseli
Global Deyimi
Static Deyimi

 

 

# Fonksiyon Nasıl Tanımlanır?


PHP programlama dilinde fonksiyon tanımlamalarının söz dizimi aşağıdaki gibidir.

Kural: function fonksiyonAdi($parametre1, $parametre2, ... $parametreN){  // kodlarınız }

Fonksiyon Tanımla Kuralları

Fonksiyon tanımlamalarında değişken tanımlama kuralları aynen geçerlidir. İlaveten;

PHP'nin rezerve edilmiş anahtar ifadeleri fonksiyon ismi olarak verilemez. Örnek: foreach

 
Rezerve Anahtar Sözcükler
__halt_compiler() abstract and array() as
break callable (PHP 5.4 itibariyle) case catch class
clone const continue declare default
die() do echo else elseif
empty() enddeclare endfor endforeach endif
endswitch endwhile eval() exit() extends
final finally (PHP 5.5 itibariyle) for foreach function
global goto (PHP 5.3'ten beri) if implements include
include_once instanceof insteadof (PHP 5.4'ten beri) interface isset()
list() namespace (PHP 5.3'ten beri) new or print
protected public require require_once private
return static switch throw trait (PHP 5.4 itibariyle)
try unset() use var while
xor yield (PHP 5.5 itibariyle) int (PHP 7 itibariyle) float (PHP 7 itibariyle) bool (PHP 7 itibariyle)
string (PHP 7 itibariyle) true (PHP 7 itibariyle) false (PHP 7 itibariyle) null (PHP 7 itibariyle) resource (PHP 7 itibariyle)
object (PHP 7 itibariyle) mixed (PHP 7 itibariyle) numeric (PHP 7 itibariyle) PHP_* Sabitleri __sihirliYontemleri()
__CLASS__ __NAMESPACE__ __FUNCTION__ T_* Sabitleri E_* Sabitleri
function ilkFonksiyonum()
{
    echo 'İlk Fonksiyonum';
} 
Tanımlanan Fonksiyonu Kullanma

Tanımlanan fonksiyonlar isimleri ile birlikte kullanılırlar.

ilkFonksiyonum();
İlk Fonksiyonum

 

 

# Parametre Gönderimi


Fonksiyonlara dışarıdan veri göndermek için parantezler içerisine kaç veri gönderilecekse o sayıda parametre belirtilerek tanımlanabilir. Parametreler birer değişken oldukları için değişken tanımlama kurallarına tabidirler.

function ilkFonksiyonum($deger)
{
    echo $deger;
} 

ilkFonksiyonum('Parametre gönderimli ilk fonksiyonum!');
Parametre gönderimli ilk fonksiyonum!
Sınırsız Parametre Gönderimi

Sınırsız parametre gönderimi bir fonksiyonun kaç parametre alacağı belirsiz olan durumlarda kullanılabilir. Sınırsız parametre için parametre gönderimi yapılan değişkenin önüne ... (üç nokta) koyularak yapılır.

function sonsuzParametreGonderimi(...$parametreler)
{
    var_dump($parametreler);
}

sonsuzParametreGonderimi(1, 2, 3, 'hey', true);
[0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> string(3) "hey" [4]=> bool(true)

Sınırsız parametre tanımlamasından sonra normal bir parametre tanımlaması yapılamaz. Yani bazı parametreler belirli görevi üstlenecekse bu parametreler sınırsız parametre tanımlamasından önce belirtilmelidir.

function sonsuzParametreGonderimi($parametre, ...$parametreler)
{
    $parametreler[] = $parametre;

    var_dump($parametreler);
}

sonsuzParametreGonderimi('benim parametrem', 1, 2, 3, 'hey', true);
[0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> string(3) "hey" [4]=> bool(true) [5]=> string(benim parametrem)
Referans Parametre Gönderimi

Referans parametre gönderiminde parametre değişkeninin hemen önüne & sembolü eklenir. Referans parametre gönderiminde amaç gönderilen parametrenin fonksiyon içinde işlenip son değeri dışarıya taşımasıdır.

function referansParametreKullanimi($parametre, &$referansParametre)
{
    $referansParametre = 10;
   
    echo $parametre;
}

referansParametreKullanimi('merhaba', $referans);

echo $referans;
merhaba
10
Parametrelerde Tür Dayatması 

Fonksiyonun kabul edeceği parametrelerin türünü belirleyebilirsiniz.

function turDayatmaliFonksiyonum(string $deger)
{
    echo $deger;
} 

turDayatmaliFonksiyonum('Tür dayatmalı ilk fonksiyonum!');
Tür dayatmalı ilk fonksiyonum!

Yukarıdaki tanımlamamızda parametrenin string türde parametre olması gerektiğini belirtik. Eğer bu tür dışında geçersiz bir veri türü gönderilirse sistem ölümcül hata üretir.

turDayatmaliFonksiyonum(['Dizi gönderemem']);
Fatal error: Uncaught TypeError: Argument 1 passed to turDayatmaliFonksiyonum() must be of the type string, array given, called in /var/www/html/test/test.php

 

 

# Değer Döndürme


Yukarıdaki örneklerde fonksiyonun içerisinde echo ile doğrudan çıktı ürettik. Ancak fonksiyonların içerisinde echo ile değer çıktılatmak çok sağlıklı bir yöntem değildir. Bunun yerine fonksiyonun içerisinde oluşacak çıktının değer döndürecek şekilde kullanılması gerekir. Değer döndürmek için return anahtar kelimesi kullanılır. 

function degerDondurenFonksiyonum($deger)
{
    return $deger;
} 

echo degerDondurenFonksiyonum('Değer döndüren ilk fonksiyonum!');
Değer döndüren ilk fonksiyonum!

Yukarıdaki örneğe dikkat ederseniz artık tanımladığımız fonksiyon değer döndürebilir durumda. 

Dönen Değere Tür Dayatması

Parametrelerde olduğu gibi bir fonksiyonun döndüreceği değerin de belli bir türde olması için zorlayabilirsiniz. 

function sehir(string $isim) : array
{
    return $isim;
} 

echo sehir('istanbul');
Fatal error: Uncaught TypeError: Argument 1 passed to sehir() must be of the type string, array given, called in /var/www/html/test/test.php on line 12

Yukarıdaki tanımlanan fonksiyonun dönüş değerini array olmaya zorladık ancak fonksiyon string türde değer döndürdüğü için ölümcül hata üretti.

function sehir(string $isim) : string
{
    return $isim;
} 

echo sehir('istanbul');
istanbul

 

 

# Değişken Etki Alanı 


Değişken etki alanı genellikle dışarıda tanımlanmış bir değişkene bir fonksiyon veya sınıf içerisinden erişilip erişilemeyeceği ile ilgili bir kavramdır. Yani {} parantezleri ile oluşturulan kod bloklarıdır. Normal değişkenler böyle bir kullanım için uygun değildir. Mesela aşağıdaki örnek bir uyarı hatası verecektir.

$sayi = 10;

function yeniSayi()
{
    return $sayi;
}

echo yeniSayi();
Notice: Undefined variable: sayi in C:\xampp\htdocs\test.php on line 7

Bu hatanın nedeni $sayi değişkeninin yeniSayi() fonksiyonu etki alanında olmamasındandır.

$GLOBALS Süper Küreseli

Bu soruna çözümü $GLOBALS süper küreseli veya global anahtar deyimi ile getiriyoruz. 

$sayi = 10;

function yeniSayi()
{
    return $GLOBALS['sayi']; # Değişkenin adı dizi anahtarı olarak kullanılır.
}

echo yeniSayi();
10
Global Deyimi

Bunun alternatifi global deyimidir.

$sayi = 10;

function yeniSayi()
{
    global $sayi;
    return $sayi;
}

echo yeniSayi();
10

Global olarak tanımlanan değişkene global gösterimi esnasından değer atayamazsınız.

global $sayi = 10;
Parse error: syntax error, unexpected '=', expecting ',' or ';' in C:\xampp\htdocs\test.php on line 7 
Static Deyimi 

Değişken etki alanı ile ilgili önemli özelliklerden biri statik değişkenlerdir. Bir statik değişken sadece işlevin etki alanında geçerli olup, programın çalışması bu etki alanı dışına çıktığı zaman değerini kaybetmez.

function yeniSayi()
{
    static $sayi = 1;

    return $sayi++ . "<br>";
}

echo yeniSayi();
echo yeniSayi();
echo yeniSayi();
1
2
3

Yukarıdaki kullanımda dikkat edilirse yöntemin her kullanılışında statik olarak tanımlanmış $sayi değişkeni son değerini korumuştur.