Yazılım

PHP Fonksiyonlar: Kendi Komutlarını Yaz

15 Şubat 2026 9 dk okuma 5 görüntülenme

Kod Tekrarına Son: PHP Fonksiyonları ile Kendi Dünyanı İnşa Et

Selamlar! PHP serimizin dördüncü durağına hoş geldiniz. Eğer önceki yazılarda dizilerle (arrays) verileri kutulara doldurduysak ve döngülerle (loops) bu kutuları tek tek açıp işlediysek, şimdi sıra geldi bu işlemleri birer "süper güce" dönüştürmeye. Bugün konumuz: Fonksiyonlar (Functions).

Yazılıma ilk başladığım 2005 yılını hatırlıyorum. O zamanlar kod yazmak benim için beyaz bir sayfaya alt alta komutlar sıralamaktan ibaretti. Bir kullanıcı giriş sistemi yapardım; aynı kod bloğunu hem kayıt sayfasına, hem giriş sayfasına, hem de profil güncelleme sayfasına kopyalayıp yapıştırırdım. Sonra ne mi olurdu? O kodda ufacık bir değişiklik yapmam gerektiğinde, mesela şifreleme mantığını değiştirdiğimde, gider tek tek 10 farklı sayfada aynı değişikliği yapmaya çalışırdım. Haliyle birini unuturdum ve sistem patlardı. Tam bir kaos.

İşte fonksiyonlar tam olarak bu noktada devreye giriyor. Benim için fonksiyon yazmak, kamp çantamı hazırlamak gibidir. Nasıl ki ormana giderken her seferinde "çakı nerede, fener nerede?" diye aramak yerine her şeyi belli ceplere yerleştirip ihtiyaç anında "tak" diye çıkarıyorsam; fonksiyonlar da kod dünyasındaki o düzenli ceplerimizdir. Pixel Lab®'da geliştirdiğimiz projelerde de temel prensibim budur: Bir işi iki kereden fazla yapıyorsan, onu fonksiyona çevir. Yazılım dünyasında buna DRY (Don't Repeat Yourself - Kendini Tekrar Etme) prensibi diyoruz. Gelin, bu prensibi nasıl hayata geçireceğimizi ve kendi komutlarımızı nasıl yazacağımızı en samimi haliyle konuşalım.

Fonksiyon Nedir ve Neden İhtiyaç Duyarız?

Teknik tanımları bir kenara bırakalım. Fonksiyon, belirli bir görevi yapmak üzere paketlenmiş kod bloğudur. PHP'nin bize sunduğu hazır fonksiyonlar var; mesela date() ile tarihi alıyoruz veya count() ile dizileri sayıyoruz. Peki, ya PHP'nin aklına gelmeyen, tamamen bizim projemize özel bir işleme ihtiyacımız varsa?

Örneğin, bir e-ticaret sitesi yapıyorsunuz ve sitedeki tüm fiyatların KDV dahil halini hesaplamanız gerekiyor. Her fiyatın altına $fiyat * 1.18 yazmak ameleliktir (kusura bakmayın, terim bu). Bunun yerine kdvHesapla($fiyat) diye kendi komutunuzu yazsanız çok daha havalı ve yönetilebilir olmaz mı?

İlk Fonksiyonumuzu Tanımlayalım

Bir fonksiyon tanımlamak için function anahtar kelimesini kullanırız. İsimlendirme konusunda ben genelde camelCase (ilk harf küçük, sonraki kelimelerin baş harfi büyük) veya snake_case (kelimeler arası alt çizgi) kullanırım. Ama en önemlisi, fonksiyonun isminin ne iş yaptığını anlatmasıdır. islemYap() diye bir fonksiyon ismi olmaz; fiyatHesapla() olur.

Hadi en basitinden başlayalım:


function selamla() {
    echo "Merhaba! Pixel Lab dünyasına hoş geldin.";
}

// Fonksiyonu çağırmak (Çalıştırmak)
selamla();

Yukarıdaki kodda selamla adında bir emir kipi oluşturduk. Biz bu emri (çağırma işlemini) verene kadar süslü parantezler { } arasındaki kod asla çalışmaz. Ne zaman ki selamla(); dedik, PHP o bloğa atlar, işini yapar ve geri döner.

Parametreler: Fonksiyona Veri Göndermek

Sabit bir mesaj veren fonksiyon çok da "akıllı" sayılmaz. Fonksiyonların asıl gücü, dışarıdan aldığı veriyi (parametreleri) işleyip bize sunmasında yatar. Bisikletle uzun bir rotaya çıktığımı düşünün; bisiklet aynı bisiklet ama pedal çevirme gücüm (parametre) değiştikçe hızım (sonuç) değişiyor.


function karsila($isim) {
    echo "Selam " . $isim . ", bugün kodlamak için harika bir gün!
"; } karsila("Buğrahan"); karsila("Ahmet");

Burada $isim bir değişkendir ancak sadece bu fonksiyonun içinde yaşar. Dışarıdan "Buğrahan" gönderirsiniz, içeride o veri işlenir.

Varsayılan Değerler (Opsiyonel Parametreler)

Peki ya kullanıcı ismini girmezse? Veya bir fonksiyona her zaman parametre göndermek zorunda kalmak istemezsek? İşte o zaman varsayılan değerler hayat kurtarır. Ben bunu projelerimde çok sık kullanıyorum. Örneğin, bir listeleme fonksiyonum var, limit belirtmezsem varsayılan olarak 10 kayıt getiriyor.


// Eğer $tur belirtilmezse, varsayılan olarak "Misafir" kabul edilir.
function kahveIsmarla($kisi = "Misafir", $tur = "Filtre Kahve") {
    echo "$kisi için bir $tur hazırlanıyor...
"; } kahveIsmarla("Buğrahan", "Americano"); // Çıktı: Buğrahan için bir Americano hazırlanıyor... kahveIsmarla("Zeynep"); // Çıktı: Zeynep için bir Filtre Kahve hazırlanıyor... kahveIsmarla(); // Çıktı: Misafir için bir Filtre Kahve hazırlanıyor...

Gördüğünüz gibi, kod esneklik kazandı. Hata verme ihtimalini azalttık ve kullanımı kolaylaştırdık.

Can Alıcı Nokta: Return vs Echo

PHP öğrenmeye yeni başlayanların (şahsen benim de ilk zamanlarda) en çok karıştırdığı yer burasıdır. "Ekrana yazdırmak" ile "değer döndürmek" arasındaki fark.

Bir fonksiyonun içinde echo kullanırsanız, o fonksiyon sonucu hemen ekrana basar. Ama gerçek hayatta, profesyonel projelerde biz veriyi hemen ekrana basmak istemeyiz. Belki o veriyi alıp veritabanına kaydedeceğiz? Belki başka bir matematilsel işlemde kullanacağız? Belki de bir e-postanın içine gömeceğiz?

Bu yüzden fonksiyonlarınızda işlem sonucunu return ile döndürmelisiniz. return, fonksiyonun işini bitirdiği ve sonucu elinize teslim ettiği andır.


function topla($sayi1, $sayi2) {
    $sonuc = $sayi1 + $sayi2;
    return $sonuc; // Sonucu fırlat, ama ekrana yazma!
}

$toplam = topla(10, 20); // $toplam artık 30 değerini taşıyor.

// Şimdi bu değeri istediğim gibi kullanabilirim.
if ($toplam > 25) {
    echo "Sayı limiti aşıldı, toplam: " . $toplam;
} else {
    echo "Limit dahilinde.";
}

Eğer yukarıdaki fonksiyonda return yerine echo kullansaydım, if bloğuyla kontrol yapamazdım çünkü elimde bir sayı değil, sadece ekrana basılmış bir yazı olurdu. Kural basit: Fonksiyon hesaplasın ve versin, ne yapacağına siz karar verin.

Değişkenlerin Kapsam Alanı (Scope)

Doğada kamp yaparken çadırımın içi benim özel alanımdır, dışarısı ise herkesin alanıdır. PHP'de de durum böyledir. Bir fonksiyonun içinde tanımladığınız değişken, dış dünyadan tamamen izoledir. Buna Yerel (Local) Değişken diyoruz.


$sehir = "İstanbul"; // Global değişken

function neresi() {
    $sehir = "Antalya"; // Yerel değişken
    echo "Fonksiyon içi: " . $sehir . "
"; } neresi(); echo "Fonksiyon dışı: " . $sehir;

Çıktı:
Fonksiyon içi: Antalya
Fonksiyon dışı: İstanbul

Gördüğünüz gibi, içerideki $sehir değişikliği dışarıyı etkilemedi. Bu harika bir güvenlik önlemidir. Aksi takdirde 1000 satırlık bir projede değişken isimleri çakışır ve işin içinden çıkamazdık.

Global Anahtar Kelimesi

Bazen (ama çok nadiren) dışarıdaki bir değişkene fonksiyon içinden erişmeniz gerekebilir. Bunun için global anahtar kelimesi kullanılır. Ancak bir abiniz olarak tavsiyem; mecbur kalmadıkça bunu kullanmayın. Kodun takibini zorlaştırır ve bağımlılık yaratır. Ben projelerimde veriyi parametre olarak göndermeyi tercih ederim.

Static Değişkenler: Hafızalı Fonksiyonlar

Normalde bir fonksiyon çalışıp bittiğinde, içindeki tüm değişkenler silinir ve hafızadan atılır. Ama bazen fonksiyonun bir önceki çalışmasındaki değeri "hatırlamasını" istersiniz. Örneğin, bir fonksiyonun kaç kere çağrıldığını saymak istiyorsunuz. İşte o zaman static devreye girer.


function sayac() {
    static $sayi = 0; // Sadece ilk çalışmada 0 olur, sonra hafızada tutulur.
    $sayi++;
    echo "Bu fonksiyon $sayi. kez çalıştı.
"; } sayac(); // 1. kez sayac(); // 2. kez sayac(); // 3. kez

Eğer static kullanmasaydık, her seferinde "1. kez" yazacaktı. Bu özellik, özellikle özyinelemeli (recursive) fonksiyonlarda veya basit cache mekanizmalarında çok işe yarar.

Kendi Alet Çantamızı Oluşturalım: Gerçek Hayat Örnekleri

Teori bitti, şimdi Pixel Lab® mutfağına girme zamanı. Size her projemde mutlaka kullandığım, kopyala-yapıştır yapıp arşivinize atabileceğiniz iki tane "utility" (yardımcı) fonksiyon yazalım.

1. SEO Uyumlu URL Oluşturucu (Slugify)

Blog yazısı başlıklarını URL'ye çevirirken Türkçe karakterleri, boşlukları ve özel işaretleri temizlememiz gerekir. "Doğa & Kamp Hayatı" başlığını "doga-kamp-hayati" haline getiren fonksiyon:


function seflink($baslik) {
    // Türkçe karakterleri değiştir
    $tr = array('ş','Ş','ı','I','İ','ğ','Ğ','ü','Ü','ö','Ö','Ç','ç','(-)');
    $eng = array('s','s','i','i','i','g','g','u','u','o','o','c','c','-');
    $baslik = str_replace($tr, $eng, $baslik);
    
    // Alfanümerik olmayan karakterleri sil, tire ile birleştir
    $baslik = preg_replace('/[^a-z0-9]/', '-', strtolower($baslik));
    
    // Birden fazla tireyi tek tireye düşür ve kenarları temizle
    $baslik = preg_replace('/-+/', '-', $baslik);
    return trim($baslik, '-');
}

echo seflink("Buğrahan ile PHP Dersleri: Bölüm 4!"); 
// Çıktı: bugrahan-ile-php-dersleri-bolum-4

2. Profesyonel Fiyat Formatlayıcı

Veritabanından fiyat genelde 12500.5 gibi gelir. Bunu kullanıcıya "12.500,50 ₺" olarak göstermek saygının bir gereğidir.


function fiyatFormatla($tutar, $paraBirimi = "₺") {
    // number_format(sayı, ondalık hane, ondalık ayracı, binlik ayracı)
    return number_format($tutar, 2, ',', '.') . ' ' . $paraBirimi;
}

echo fiyatFormatla(1540.7); 
// Çıktı: 1.540,70 ₺

Kendi Kütüphanenizi Kurmanın Vakti Geldi

Fonksiyonlar, yazılım hayatınızda dağınıklığı bitiren, kodunuzu modüler ve okunabilir hale getiren en temel yapı taşlarıdır. Bugün öğrendiğimiz tanımlama yöntemleri, parametre kullanımı ve return mantığı, sadece PHP'de değil, JavaScript, Python veya C# gibi dillerde de karşınıza çıkacak evrensel kurallardır.

Benim size tavsiyem; bugünden itibaren yazdığınız her kod bloğuna "Bunu daha sonra tekrar kullanır mıyım?" gözüyle bakın. Eğer cevabınız evetse, onu hemen bir fonksiyona dönüştürün ve isimlendirin. Zamanla kendinize ait, içinde onlarca faydalı fonksiyonun olduğu bir functions.php dosyanız olacak. İşte o dosya, sizin dijital dünyadaki İsviçre çakınızdır.

Şimdi sıra sizde. Yukarıdaki örnekleri kendi bilgisayarınızda deneyin, değiştirin ve bozun. Hata yapmaktan korkmayın, en iyi böyle öğrenilir. Bir sonraki yazımda, bu fonksiyonları kullanarak web formlarından gelen verileri nasıl işleyeceğimizi ve güvenli bir şekilde nasıl yöneteceğimizi konuşacağız. O zamana kadar, kodlarınız temiz, hatalarınız az olsun. Doğayla ve kodla kalın.

Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yazın!

Yorum Yaz

E-posta adresiniz yayınlanmayacaktır.
0 / 2000