İçeriğe geç
Muhammet Şafak
Diller 3 dk okuma

PHP 7.1: nullable tipler ve void dönüş tipi

PHP 7.1 ile gelen nullable tip bildirimleri ve void dönüş tipi, fonksiyon imzalarını daha okunur ve net kılıyor.


PHP 7.0 ile birlikte skaler tip bildirimleri ve dönüş tipleri hayatımıza girdi. O sürümü ilk kullandığımda fonksiyon imzalarının aniden ne kadar açık hale geldiğini fark etmiştim. Aradan altı ay geçmedi, PHP 7.1 geldi ve bu kez iki küçük ama günlük yazımı doğrudan etkileyen ekleme daha geldi: nullable tipler ve void dönüş tipi.

Bu değişiklikler göründüğü kadar küçük değil. İmzaya bakıp “bu fonksiyon null döndürebilir mi?” ya da “bu parametre boş gelebilir mi?” sorularına kaynak kodu açmadan yanıt verebilmek, en az pre-check yazmak kadar değerli.

Nullable tipler neden gerekli?

PHP 7.0’da şöyle bir imza yazabiliyorduk:

function findUser(int $id): User
{
    // ...
}

Peki ya kullanıcı bulunamazsa? Ya null döndürmek istiyorsak? 7.0’da bunu dönüş tipine yansıtmanın yolu yoktu; tip bildirirken null olasılığını görmezden geliyorduk ya da mixed gibi anlamsız bir şeye sığınıyorduk.

PHP 7.1 bu boşluğu soru işaretiyle kapattı:

function findUser(int $id): ?User
{
    $row = $this->db->find($id);
    return $row ? new User($row) : null;
}

Artık imzayı okuyan biri “bu fonksiyon ya bir User nesnesi ya da null döndürür” bilgisini tek bakışta alıyor. Aynı sözdizimi parametreler için de geçerli:

function greet(?string $name): string
{
    return 'Merhaba, ' . ($name ?? 'misafir');
}

Burada $name gönderilmeyebilir ya da null gelebilir. Fonksiyon her iki durumu da karşılıyor ve bunu imzasında açıkça söylüyor.

void dönüş tipi

Bir fonksiyon gerçekten hiçbir şey döndürmüyorsa bunu void ile bildirmek artık mümkün:

function logActivity(string $message): void
{
    file_put_contents('/var/log/app.log', $message . PHP_EOL, FILE_APPEND);
}

void bildirilen bir fonksiyonun içinde return $birSey; yazarsanız TypeError alırsınız. Yalnız return; ya da hiç return yazmamak serbesttir; ikisi de geçerlidir.

Bu ne işe yarıyor? Kodu okuyan birinin “bu fonksiyonun dönüş değerini bir yere atamaya çalışsam ne olur?” sorusunu sormadan geçmesini sağlıyor. Niyeti imzaya yazmak diyorum buna; belge değil, derleme zamanı garantisi.

Gerçek bir senaryo

Bir e-ticaret projesinde sipariş bulma ve durum güncelleme fonksiyonlarını düşünelim:

function findOrder(int $orderId): ?Order
{
    return Order::find($orderId); // Eloquent, bulamazsa null döner
}

function updateOrderStatus(Order $order, string $status): void
{
    $order->status = $status;
    $order->save();
}

findOrder null dönebilir, çağıran kod bunu bilir ve null kontrolü yapmak zorunda olduğunu anlar. updateOrderStatus ise yalnızca bir yan etki üretiyor, dönüş değeri yok — bunu da imza söylüyor.

Bu iki fonksiyonun davranışını anlamak için içine bakmak gerekmiyor. Takım arkadaşıyla çalışırken ya da üç ay sonra kendi kodunu okurken bu fark önemli hissettiriyor.

nullable tip ile varsayılan değer arasındaki fark

Bir ince nokta: ?string $name ile string $name = '' aynı şey değil. Birincisinde parametre null alabilir veya tamamen atlanabilir; ikincisinde null geçilemez, yalnızca string beklenir ve verilmezse boş string kullanılır. Semantik fark önemli: “bu değer bilinmiyor” ile “bu değer yok ama default var” farklı niyetler. Nullable tip, “bu değer gerçekten yoksa bunu bilelim” diyorken varsayılan değer “eksik gelirse şunu kullan” diyor. İkisini birbirinin yerine kullanmak ileride beklenmedik davranışlara yol açabiliyor.

Küçük ekleme, büyük kazanım

PHP 7.1’in bu iki özelliği, büyük bir refaktör gerektirmeden mevcut koda eklenebiliyor. Yeni yazdığım her fonksiyona artık nullable tip veya void eklemeyi alışkanlık haline getirdim; çünkü imzanın “yalan söylememesi” kodun geri kalanından daha uzun ömürlü bir doğruluk sağlıyor.

Tip bildirimi gerektiren yerlerde mixed ya da belgesiz null döndürmek yerine ?Tip yazmak, hem kendinize hem de kodu sonradan okuyacak birine küçük bir iyilik.

Etiketler: #PHP
Paylaş:

İlgili Yazılar

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi