# 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.

- Yayın: 2017-01-01
- Kategori: Diller
- Etiketler: PHP
- Okuma süresi: 3 dk okuma
- Kaynak: https://www.muhammetsafak.com.tr/blog/php-7-1-nullable-tipler-ve-void-donus-tipi/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
[PHP 7.0 ile birlikte skaler tip bildirimleri ve dönüş tipleri](/blog/php-7-de-skaler-tip-bildirimleri-ve-donus-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:

```php
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ı:

```php
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:

```php
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:

```php
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:

```php
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.
