Fonksiyonlar
"ZN Framework'e ait tüm paketler framework dışında da kullanılabilir esneklikte tasarlanmıştır."
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 Tanımlama Kuralları
● Tanımlanan Fonksiyonu Kullanma● Sınırsız Parametre Gönderimi
● Referans Parametre Gönderimi
● Parametrelerde Tür Dayatması
# 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ı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 | |
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 fonksiyonlar isimleri ile birlikte kullanılırlar.
ilkFonksiyonum();
# 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!');
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);
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);
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;
10
Fonksiyonun kabul edeceği parametrelerin türünü belirleyebilirsiniz.
function turDayatmaliFonksiyonum(string $deger)
{
echo $deger;
}
turDayatmaliFonksiyonum('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']);
# 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!');
Yukarıdaki örneğe dikkat ederseniz artık tanımladığımız fonksiyon değer döndürebilir durumda.
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');
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');
# 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();
Bu hatanın nedeni $sayi değişkeninin yeniSayi() fonksiyonu etki alanında olmamasındandır.
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();
Bunun alternatifi global deyimidir.
$sayi = 10;
function yeniSayi()
{
global $sayi;
return $sayi;
}
echo yeniSayi();
Global olarak tanımlanan değişkene global gösterimi esnasından değer atayamazsınız.
global $sayi = 10;
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();
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.