2 Mayıs 2007 Çarşamba

PHP ile Kullanıcı Tanımlı Fonksiyonlar

Merhaba Webkolog ailesi!

Programlamada "kendini tekrar etme" (Don't Repeat Yourself - DRY) prensibi çok önemlidir. Aynı kod parçasını defalarca yazmak yerine, onu bir kez yazıp ihtiyaç duyduğumuz her yerde kullanabilmek, hem zaman kazandırır hem de kodunuzu daha temiz ve yönetilebilir hale getirir. İşte tam da bu noktada kullanıcı tanımlı fonksiyonlar devreye giriyor! PHP'de kendi fonksiyonlarınızı oluşturarak, belirli görevleri yerine getiren yeniden kullanılabilir kod blokları yazabilirsiniz. Hadi gelin, fonksiyonların gücünü keşfedelim!


Fonksiyon Nedir ve Neden Kullanılır?

Bir fonksiyon, belirli bir görevi yerine getirmek üzere tasarlanmış, isimlendirilmiş bir kod bloğudur. Fonksiyonları kullanmanın başlıca faydaları şunlardır:

  • Kod Tekrarını Önleme: Aynı işi yapan kodu birden fazla yere yazmak yerine, bir fonksiyon içinde tanımlarsınız.
  • Kod Okunabilirliği: Karmaşık işlemleri küçük, anlaşılır fonksiyonlara bölerek kodunuzu daha okunabilir hale getirirsiniz.
  • Modülerlik: Uygulamanızı daha küçük, bağımsız modüllere ayırabilirsiniz.
  • Bakım Kolaylığı: Bir hatayı veya değişikliği sadece fonksiyonun içinde yapmanız yeterli olur.

Fonksiyon Tanımlama ve Çağırma

PHP'de bir fonksiyonu function anahtar kelimesiyle tanımlarız. Fonksiyonlar parametre alabilir ve bir değer döndürebilirler.


<?php
// Parametresiz ve değer döndürmeyen bir fonksiyon
function merhabaYaz() {
    echo "Merhaba Webkolog!<br>";
}

// Fonksiyonu çağırma
merhabaYaz(); // Çıktı: Merhaba Webkolog!

// Tek parametre alan bir fonksiyon
function isimSoyisimYaz($ad) {
    echo "Hoş geldin, " . $ad . "!<br>";
}

isimSoyisimYaz("Ali"); // Çıktı: Hoş geldin, Ali!

// Varsayılan değere sahip parametre alan fonksiyon
function selamlama($isim = "Misafir") {
    echo "Merhaba, " . $isim . "!<br>";
}

selamlama();       // Çıktı: Merhaba, Misafir!
selamlama("Ayşe"); // Çıktı: Merhaba, Ayşe!

// Birden fazla parametre alan fonksiyon
function toplama($sayi1, $sayi2) {
    $sonuc = $sayi1 + $sayi2;
    echo "Toplam: " . $sonuc . "<br>";
}

toplama(5, 7); // Çıktı: Toplam: 12

// Değer döndüren fonksiyon (return anahtar kelimesi ile)
function carpma($s1, $s2) {
    $sonuc = $s1 * $s2;
    return $sonuc; // Sonucu çağrıldığı yere döndürür
}

$carpimSonucu = carpma(4, 6);
echo "Çarpım sonucu: " . $carpimSonucu . "<br>"; // Çıktı: Çarpım sonucu: 24

// Not: 'return' deyimi aynı zamanda fonksiyonun çalışmasını da sonlandırır.
// Alt fonksiyon tanımlama (Önemli: İç içe fonksiyonlar sadece dıştaki fonksiyon çağrıldığında tanımlanır)
function disFonksiyon($deger) {
    echo "Dış fonksiyon çalışıyor...<br>";

    function icFonksiyon() {
        echo "İç fonksiyon çalışıyor...<br>";
    }

    icFonksiyon(); // İç fonksiyonu burada çağırabiliriz
}

disFonksiyon("deneme"); // Hem dış hem iç fonksiyon çalışır
// icFonksiyon(); // Dış fonksiyon çağrılmadan önce hata verir!
?>

Parametreleri Referans ile Geçirme (Call by Reference)

Normalde fonksiyonlara gönderilen değişkenler kopyalanır (değer ile geçirme). Ancak bir parametrenin başına & işareti koyarsanız, o parametre değişkene bir referans olarak geçer. Bu, fonksiyon içinde parametre üzerinde yapılan değişikliklerin, fonksiyon dışında orijinal değişkeni de etkileyeceği anlamına gelir.


<?php
$sayi = 10;

function artir(&$input) { // & işareti ile referans olarak alıyoruz
    $input++;
    echo "Fonksiyon içinde: " . $input . "<br>";
}

artir($sayi); // sayi değişkenini referans olarak gönderiyoruz
echo "Fonksiyon dışında: " . $sayi . "<br>"; // Çıktı: 11 (Orijinal $sayi değişti!)
?>

Fonksiyonlarda Global Değişken Kullanımı

Fonksiyonlar kendi "yerel" kapsamlarına (scope) sahiptir, yani fonksiyon içinde tanımlanan değişkenler dışarıdan erişilemez. Eğer fonksiyon içinde dışarıdaki bir global değişkene erişmek veya onu değiştirmek isterseniz, global anahtar kelimesini kullanmanız gerekir.


<?php
$globalDeger = 5; // Global bir değişken

function globalDegeriKullan($parametre) {
    global $globalDeger; // Global $globalDeger değişkenini kullanacağımızı belirtiyoruz
    return $parametre * $globalDeger;
}

echo "Global değeri kullanarak hesaplama: " . globalDegeriKullan(10) . "<br>"; // Çıktı: 50

// Veya $GLOBALS süper global dizisini kullanabilirsiniz:
$baskaGlobalDeger = 10;
function globalDegeriKullan2($parametre) {
    return $parametre * $GLOBALS['baskaGlobalDeger'];
}

echo "GLOBALS dizisi ile hesaplama: " . globalDegeriKullan2(3) . "<br>"; // Çıktı: 30
?>

Dinamik Fonksiyon Çağrıları ve İlgili Fonksiyonlar

PHP, fonksiyonları dinamik olarak çağırmanıza veya fonksiyonlarla ilgili bilgi almanıza olanak tanıyan bazı yerleşik fonksiyonlar sunar.


<?php
function denemeToplama($a, $b) {
    return $a + $b;
}

// Fonksiyonu string ismiyle çağırma: call_user_func()
echo "call_user_func ile toplama: " . call_user_func('denemeToplama', 10, 20) . "<br>"; // Çıktı: 30

// Parametreleri dizi olarak gönderme: call_user_func_array()
$parametreler = array(5, 8);
echo "call_user_func_array ile toplama: " . call_user_func_array('denemeToplama', $parametreler) . "<br>"; // Çıktı: 13

// Fonksiyonun varlığını kontrol etme: function_exists()
if (function_exists('denemeToplama')) {
    echo "denemeToplama fonksiyonu mevcut.<br>";
}

if (!function_exists('olmayanFonksiyon')) {
    echo "olmayanFonksiyon fonksiyonu mevcut değil.<br>";
}

// Fonksiyon içinde çağrılan fonksiyon hakkında bilgi:
function bilgiAl($param1, $param2, $param3) {
    echo "Parametre sayısı: " . func_num_args() . "<br>"; // Çıktı: 3
    echo "İkinci parametre (indeks 1): " . func_get_arg(1) . "<br>"; // Çıktı: 'iki'
    echo "Tüm parametreler (dizi olarak): ";
    print_r(func_get_args()); // Çıktı: Array ( [0] => 1 [1] => iki [2] => true )
    echo "<br>";
}

bilgiAl(1, 'iki', true);
?>

Anonim Fonksiyonlar (PHP 5.3 öncesinde create_function ile)

PHP 5.2'de direkt olarak "closure" (anonim fonksiyon) desteği yoktur, ancak create_function() ile benzer bir işlevsellik sağlanabilir. Uyarı: create_function() PHP 7.2'de kullanımdan kaldırılmış ve PHP 8.0'da tamamen kaldırılmıştır. Ancak PHP 5.2 makalesi yazdığımız için burada bahsediyoruz.


<?php
// string olarak fonksiyon kodu verilir
$toplaFonksiyonu = create_function('$a, $b', 'return $a + $b;');
echo "create_function ile toplama: " . $toplaFonksiyonu(5, 3) . "<br>"; // Çıktı: 8
?>

Özyinemeli (Recursive) Fonksiyonlar

Özyinemeli fonksiyon, kendi kendini çağıran bir fonksiyondur. Belirli bir temel duruma ulaşana kadar kendini tekrar eder. Özellikle ağaç yapıları veya faktöriyel gibi matematiksel hesaplamalar için kullanışlıdır.


<?php
function faktoriyelHesapla($n) {
    // Temel durum: n 0 veya 1 ise 1 döndür
    if ($n <= 1) {
        return 1;
    }
    // Özyineli durum: n * (n-1)!
    return $n * faktoriyelHesapla($n - 1);
}

echo "5'in faktöriyeli: " . faktoriyelHesapla(5) . "<br>"; // Çıktı: 120 (5*4*3*2*1)
?>

Kullanıcı tanımlı fonksiyonlar, PHP kodunuzu daha modüler, okunabilir ve yönetilebilir hale getirmenin temelidir. Her bir fonksiyonun belirli bir görevi üstlenmesi, karmaşık uygulamaların geliştirilmesini ve bakımını kolaylaştırır. Bol bol fonksiyon yazarak bu konudaki yeteneğinizi geliştirmenizi şiddetle tavsiye ederim!

Webkolog'u takipte kalın!

Hepinize bol kodlu ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder