
PHP Fonksiyonlar: Parametre, Dönüş Tipi ve Kapsam
Fonksiyon, tekrarlanan işi tek bir isim altında toplayan yapıdır. İyi tanımlanmış bir fonksiyon tek bir iş yapar, girdisini parametreden alır ve sonucunu döndürür. Dışarıdaki değişkenlere doğrudan dokunan fonksiyonlar test edilmesi ve takip edilmesi zor kod üretir. Aynı fonksiyon aynı girdilerle her çağrıldığında aynı sonucu veriyorsa, davranışı tahmin edilebilir olur ve hata ayıklama süresi belirgin biçimde kısalır.
Tanım ve tip bildirimi
Parametre ve dönüş tipleri bildirildiğinde hatalı kullanım çağrı anında ortaya çıkar. Dönüş tipi null olabiliyorsa soru işareti ile belirtilir:
declare(strict_types=1);
function kdvHesapla(float $tutar, float $oran = 0.20): float
{
return round($tutar * (1 + $oran), 2);
}
function kullaniciBul(array $liste, int $id): ?array
{
foreach ($liste as $k) {
if ($k['id'] === $id) {
return $k;
}
}
return null;
}Varsayılan ve isimli argümanlar
Varsayılan değeri olan parametreler listenin sonunda yer alır. PHP 8 ile gelen isimli argümanlar, çok parametreli fonksiyonlarda çağrının okunurluğunu artırır ve sıraya bağımlılığı kaldırır:
function rapor(string $baslik, bool $detay = false, string $format = 'html'): string
{
// ...
return $format;
}
rapor('Aylık özet', format: 'pdf');Değişken sayıda argüman gerektiğinde üç nokta kullanılır. Bu yapı, dizi geçirmeye göre imzayı daha açık bırakır:
function topla(int ...$sayilar): int
{
return array_sum($sayilar);
}
topla(1, 2, 3);Değişken kapsamı
Fonksiyon içinde tanımlanan değişkenler dışarıdan görünmez, dışarıdaki değişkenler de otomatik olarak içeride kullanılamaz. Bu yalıtım kasıtlıdır ve global anahtar kelimesiyle delinmemelidir. İhtiyaç duyulan değer parametre olarak geçilir.
static ile tanımlanan yerel değişken çağrılar arasında değerini korur. Sayaç gibi sınırlı durumlarda işe yarar, ancak fonksiyonu duruma bağımlı hale getirdiği için dikkatli kullanılmalıdır:
function sayac(): int
{
static $adet = 0;
$adet++;
return $adet;
}Anonim fonksiyonlar ve ok fonksiyonları
Yalnızca bir yerde kullanılacak kısa mantık için isimlendirilmiş fonksiyon tanımlamaya gerek yoktur. Anonim fonksiyon dış kapsamdaki değişkeni use ile alır; ok fonksiyonu ise otomatik olarak yakalar ve tek ifadeyle sınırlıdır:
$limit = 1000;
$buyukler = array_filter($tutarlar, function (float $t) use ($limit): bool {
return $t > $limit;
});
// aynı iş, ok fonksiyonuyla
$buyukler = array_filter($tutarlar, fn(float $t): bool => $t > $limit);Referansla parametre
Parametreler varsayılan olarak değer kopyası şeklinde geçer. Değişkenin kendisini değiştirmek gerekiyorsa referans kullanılır, ancak bu durum çağıran tarafta beklenmedik sonuçlar doğurabileceği için nadiren tercih edilmelidir:
function siralaVeSay(array &$dizi): int
{
sort($dizi);
return count($dizi);
}Fonksiyonu ne zaman bölmek gerekir?
Bir fonksiyonun uzunluğu tek başına ölçüt değildir. Bölme kararı için daha güvenilir işaret, fonksiyonun adının işini tam anlatamaz hale gelmesidir. Adında ve geçen bir fonksiyon genellikle iki iş yapıyordur.
İkinci işaret, parametre sayısının artmasıdır. Dörtten fazla parametre alan fonksiyonlarda çağrı tarafı okunmaz hale gelir. Bu durumda ilişkili parametreler tek bir diziye ya da nesneye taşınır.
// bölünmesi gereken imza
function kaydet(string $ad, string $eposta, string $sehir,
string $telefon, bool $bulten, bool $onay): bool { /* ... */ }
// veriyi tek yapıda topla
function kaydet(array $kullanici): bool { /* ... */ }Fonksiyon mu, sınıf metodu mu?
Girdisini parametreden alıp sonucunu döndüren, dış duruma bağlı olmayan işler için serbest fonksiyon yeterlidir. Ortak bir durumu paylaşan, birlikte anlam kazanan birden fazla işlem varsa sınıf metodu daha uygun olur.
Ayrımın pratik göstergesi şudur: aynı üç dört fonksiyon sürekli aynı parametreleri alıyorsa, o parametreler aslında bir nesnenin durumudur. Bu noktada fonksiyonları sınıfa taşımak imzaları da sadeleştirir:
// tekrar eden bağlantı parametresi
function kullaniciGetir(PDO $db, int $id): ?array { /* ... */ }
function kullaniciSil(PDO $db, int $id): bool { /* ... */ }
// durum sınıfa taşınır
final class KullaniciDeposu
{
public function __construct(private PDO $db) {}
public function getir(int $id): ?array { /* ... */ }
public function sil(int $id): bool { /* ... */ }
}Hata durumunda ne döndürmeli?
Bir fonksiyon beklenen sonucu üretemediğinde iki seçenek vardır: null döndürmek ya da istisna fırlatmak. Ayrım, durumun olağan olup olmamasına göre yapılır. Aranan kaydın bulunamaması olağandır ve null uygundur; veritabanı bağlantısının kurulamaması olağan değildir ve istisna gerektirir.
function kullaniciBul(PDO $db, int $id): ?array
{
$stmt = $db->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$id]);
return $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
}
function kullaniciSil(PDO $db, int $id): void
{
if ($id <= 0) {
throw new InvalidArgumentException('Geçersiz kimlik');
}
// ...
}Hata kodu döndüren fonksiyonlardan kaçınmak gerekir. Çağıran taraf dönüş değerini kontrol etmeyi unuttuğunda hata sessizce yutulur; istisna ise yakalanmadığında görünür olur.
Kontrol listesi
- Her fonksiyon tek bir iş yapar ve adı bu işi anlatır.
- Parametre ve dönüş tipleri bildirilir.
- global anahtar kelimesi yerine parametre geçilir.
- Uzun parametre listelerinde isimli argüman kullanılır.
- Referanslı parametre yalnızca gerçekten gerekliyse tercih edilir.
PHP eğitim serisi
Bu yazı, temel sözdiziminden üretim ortamına kadar ilerleyen 25 bölümlük serinin bir parçası. Bölümler sırayla okunacak biçimde hazırlandı, ancak her biri tek başına da kullanılabilir.
Temeller
- Kurulum ve temel sözdizimi
- Döngüler ve akış kontrolü
- Diziler
- Fonksiyonlar (bu yazı)
- String fonksiyonları
- Süper globaller
- Form işleme
- Dosya işlemleri
Dilin ayrıntıları
Nesne yönelimli PHP
- Sınıf ve nesne
- Kalıtım, arayüz ve trait
- Statik üyeler, sabitler ve enum
- Namespace, Composer ve autoload
Veri ve güvenlik
- PDO ile veritabanı işlemleri
- Oturum yönetimi ve kimlik doğrulama
- Güvenli çıktı ve XSS
- JSON ile veri değişimi
Dış dünya ve üretim
Yorumlar
İlk yorumu sen yap.
İlgili Yazılar

PHP Uygulamasını Üretime Almak: Yapılandırma ve Güvenlik
Geliştirme makinesinde çalışan kod ile üretimde güvenle çalışan kod arasındaki fark yapılandırmadır. Ayarlar, izinler, dağıtım akışı ve son kontroller.

PHP ile REST API Yazmak: Yönlendirme ve HTTP Durum Kodları
Bir API'nin kalitesi çoğunlukla ayrıntılarda belli olur: doğru durum kodu, tutarlı hata biçimi ve öngörülebilir adresler. Saf PHP ile uçtan uca kurulum.

PHPUnit ile Birim Test Yazmak: Kurulum, Sahte Nesneler ve Kapsam
Testin amacı hata bulmak değil, değişikliği güvenle yapabilmektir. Kurulum, ilk test, sahte nesneler ve test edilebilir kodun özellikleri.