PHP 7.4 PHP 7.4 ile Gelen Arrow Functions (Ok Fonksiyonları)

Koddly

Administrator
Yönetici
PHP 7.4 ile birlikte dilimize eklenen arrow functions (ok fonksiyonları), kod yazımını daha kısa ve okunabilir hale getiren önemli bir yenilik. Peki nedir bu arrow functions ve nasıl kullanılır? Gelin birlikte inceleyelim.



1 - fn Anahtar Kelimesi
PHP 7.4 ile birlikte fn anahtar kelimesi artık rezerve edilmiş bir kelime haline geldi. Yani artık değişken adı olarak kullanamazsınız.

Eskiden Nasıldı?
Geleneksel olarak anonim fonksiyonlar oluştururken function anahtar kelimesini kullanırdık:
PHP:
$add = function ($valone,$valtwo) {
    return $valone + $valtwo;
};
$add(1,2) // 3

Arrow Functions ile Nasıl Oldu?
Yeni arrow functions sayesinde aynı işlemi çok daha kısa bir şekilde yazabiliyoruz:
PHP:
$add = fn($valone,$valtwo) => $valone + $valtwo;
$add(1,2) // 3
Gördüğünüz gibi kod çok daha temiz ve okunabilir!



2 - Parent Scope (Üst Kapsam) Erişimi
Arrow functions'ın en büyük avantajlarından biri, üst kapsamdaki değişkenlere otomatik erişim sağlamasıdır.

Eski Yöntem: use Anahtar Kelimesi
Eskiden üst kapsamdaki bir değişkeni kullanmak için mutlaka use anahtar kelimesini kullanmak zorundaydık:
PHP:
$y = 1;
$fn = function ($x) use ($y) {
    return $x + $y;
};
echo $fn(2); // 3

Yeni Yöntem: Otomatik Erişim
Arrow functions ile üst kapsamdaki değişkenler otomatik olarak by-value (değer olarak) yakalanır:
PHP:
$y = 1;
$fn = fn($x) => $x + $y;
echo $fn(2); // 3
use yazmaya gerek yok! Çok daha pratik değil mi?

Class İçinde $this Kullanımı
Bu otomatik erişim özelliği sınıf metodları içindeki $this değişkeni için de geçerlidir:
PHP:
class foo {
   public function test() {
       $context = fn() => var_dump($this);
       $context();
   }
}
$test = new foo();
$test->test();  // object(foo)#1 (0) { }



Önemli Uyarı: Değer Değiştirilemez! ⚠️
Arrow functions'da değişkenler by-value (değer olarak) yakalandığı için, fonksiyon içinde yapılan değişiklikler üst kapsamdaki orijinal değişkeni etkilemez.

Örnek 1: Değer Artırma
PHP:
$y = 1;
$fn = fn() => $y++;
$fn(); // Has no effect
echo $y  // 1

Örnek 2: Başka Bir Değişkene Atama
Closure içinde yeni bir değişkene atama yapmak da üst kapsamı etkilemez:
PHP:
$y = 1;
$f = 0;
$fn = fn() => $f = $y + 1;
$fn();
echo $f; // 0



3 - Function Signatures (Fonksiyon İmzaları)
PHP'de arrow functions ile birlikte tip tanımlama (type hinting) özelliğini tam olarak kullanabiliyoruz. Bu sayede hem parametre tiplerini hem de dönüş değeri tipini belirleyebiliyoruz.

Temel Kullanım
PHP:
fn(int $x) => $x; // the argument type must be (int)
fn(): int => $x; // type of return value (int)

Tip Kontrolü ve Hata Yakalama
Eğer fonksiyona yanlış tip gönderirseniz, TypeError hatası gösterilir ve bu hatayı yakalayabilirsiniz:
PHP:
$var = 10;
$int_fn = fn(int $x): int => $x;
var_dump($int_fn($var)); // int(10)
try {
    $int_fn("foo");
} catch (TypeError $e) {
    echo $e->getMessage(), "\n"; // Argument 1 passed to {closure}() must be of the type int, string given, called in x on line y
}

Nullable Types (Boş Değer Kabul Eden Tipler)
PHP 7.1'den beri ?type yazımı ile parametrenin hem belirtilen tip hem de null olmasına izin verebilirsiniz:
PHP:
$funn = fn(?int... $args): array => $args;
var_dump($funn(20, null, 30)); // Array(3) { [0]=> int(20) [1]=> NULL [2]=> int(30) }

Önemli Not: Yukarıdaki fonksiyona integer veya null dışında bir değer gönderirseniz hata alırsınız:

PHP:
$funn("text");
// Hata: Argument passed to {closure}() must be of the type int or null,
// string given, called in x on line y



4 - İç İçe Arrow Functions (Nested Arrow Functions)
Arrow functions'ları iç içe kullanabilir ve her seviyede üst kapsamdaki değişkenlere erişebilirsiniz:

PHP:
$var = 6;
var_dump((fn() => fn() => $var)()());  // int(6)
var_dump((fn() => function() use($var) { return $var; })()()); // int(6)
Her iki örnekte de $var değişkenine başarıyla erişiliyor ve sonuçta int(6) elde ediyoruz.



5 - Hata Yönetimi ve Lazy Evaluation
Arrow functions içindeki hatalar, fonksiyon çağrılmadığı sürece gösterilmez. Bu "lazy evaluation" (tembel değerlendirme) olarak bilinir.

Örnek: Hata Gösterilmez
PHP:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$b = 1;
fn() => $b + $c; // no error, nothing


ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$b = 1;
(fn() => $b + $c)(); // Notice: Undefined variable: c in the location on line x
Yukarıdaki kodda $c değişkeni tanımlı olmasa da fonksiyon çağrılmadığı için hata almayız.

Örnek: Fonksiyon Çağrılınca Hata Gösterilir
PHP:
ini_set('display_errors', 1);
error_reporting(E_ALL);
$b = 1;
(fn() => $b + $c)();
// Notice: Undefined variable: c in the location on line x

Fonksiyonu çağırdığımızda (sonundaki () parantezler ile), $c değişkeninin tanımlı olmadığına dair hata alırız.

Not: Eğer error reporting kapalıysa, PHP sadece int(1) çıktısı verir ve hatayı görmezden gelir.



Özet ve Sonuç
Arrow functions ile PHP 7.4'te kazandığımız avantajlar:
✅ Daha kısa syntax: Tek satırda fonksiyon tanımlama
✅ Otomatik scope erişimi: use yazmaya gerek yok
✅ Tip güvenliği: Function signatures ile tam tip kontrolü
✅ Daha okunabilir kod: Özellikle array işlemlerinde harika
✅ Modern PHP: Güncel standartlara uygun kodlama

Ancak şunu unutmayın:
⚠️ Değişkenler by-value yakalanır - orijinal değerleri değiştirilemez
⚠️ Tek satırlık ifadeler için idealdir - çok satırlı işlemler için klasik closure'lar daha uygun
⚠️ Hatalar lazy evaluation ile çalışır - fonksiyon çağrılana kadar hata gösterilmez

Ne Zaman Kullanmalı?
Arrow functions özellikle şu durumlarda çok kullanışlıdır:

Array fonksiyonları (array_map, array_filter, usort vb.)
Basit callback'ler ve event handler'lar
Tek satırlık dönüşümler ve hesaplamalar
Kısa matematiksel işlemler
Tip güvenliği gereken senaryolar

Pratik Kullanım Örneği:
PHP:
$numbers = [1, 2, 3, 4, 5];

// Eski yöntem
$squared = array_map(function($n) { return $n * $n; }, $numbers);

// Arrow functions ile
$squared = array_map(fn($n) => $n * $n, $numbers);

print_r($squared); // [1, 4, 9, 16, 25]

// Tip güvenliği ile
$squared = array_map(fn(int $n): int => $n * $n, $numbers);



Kaynaklar
 
Son düzenleme:
Geri
Üst