# PHP'de Veri Türleri Dönüşümü ve Tür Dayatma İşlemleri

> PHP'de veri türü dönüşümü ve tür dayatma: gettype, settype, var_dump ve dönüşüm işlemleri.

- Yayın: 2021-09-22
- Kategori: Diller
- Etiketler: PHP
- Okuma süresi: 2 dk okuma
- Kaynak: https://www.muhammetsafak.com.tr/blog/php-veri-turleri-donusumu-tur-dayatma-islemleri/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
PHP'nin tip sistemiyle uzun bir geçmişim var. Yıllarca PHP'nin "tipleri sizin yerinize düşünmesi"ni bir kolaylık olarak gördüm; sonra bunun aynı zamanda bir tuzak olduğunu, hata ayıklarken kaybettiğim saatlerle öğrendim. Bu yazı, PHP'de veri türü dönüşümünü ve tür dayatmasını bir özellik listesi olarak değil, bir karar konusu olarak ele alıyor.

## PHP, türü sizin için tahmin eder

PHP'de bir değişken tanımladığınızda türü siz belirtmezsiniz; PHP değere bakar ve karar verir. `gettype()` ile bu kararı görebilirsiniz:

```php
$veri = "Muhammet Şafak";
echo gettype($veri); // string
```

`gettype()` şu değerleri döndürür: `boolean`, `integer`, `double` (float dahil), `string`, `array`, `object`, `resource`, `NULL`. Pratikte bunu nadiren çağırırım — ama PHP'nin bir değeri nasıl gördüğünü anlamak, sonraki bütün kararların temeli.

## Dönüşüm: açık olun

Bir değerin türünü değiştirmenin birkaç yolu var. `settype()` değişkenin türünü yerinde değiştirir; cast operatörleri (`(int)`, `(string)`, `(bool)`…) yeni bir değer üretir; `intval()`, `strval()` gibi fonksiyonlar ise aslını bozmadan karşılığını döndürür.

```php
$veri = "10";
$sayi = (int) $veri;        // 10 — $veri'ye dokunulmaz
settype($veri, "integer");  // $veri artık integer
```

Üçü de işe yarar. Tercihim cast operatörleri: niyeti okurken görmek istiyorum. `settype()` bir değişkeni sessizce başka bir şeye dönüştürdüğü için, kodu sonradan okuyan biri (çoğu zaman ben) o değişkenin hâlâ string olduğunu sanıp yanılıyor. Açık dönüşüm, açık niyettir.

## Asıl mesele: tür dayatma

[PHP 7, fonksiyon parametrelerine ve dönüş değerlerine tip bildirme imkânı getirdi](/blog/php-7-de-skaler-tip-bildirimleri-ve-donus-tipleri/). Bu, dilin tarihindeki en değerli eklemelerden biri:

```php
function topla(int $x, int $y): int
{
    return $x + $y;
}
```

Tip bildirimi yalnızca bir kontrol değil, aynı zamanda bir dokümantasyondur. Bir fonksiyonun imzasına bakan biri ne beklediğini ve ne döndürdüğünü tahmin etmeden görür. Kendi kodum on binlerce satıra çıktığında bunun değerini somut olarak yaşadım.

Ama bir tuzak var. Varsayılan olarak PHP "esnek" davranır:

```php
function topla(int $x, int $y): int { return $x + $y; }
echo topla("3", "4"); // 7 — string'ler sessizce int'e çevrildi
```

`"3"` bir string'di; PHP onu int kabul etti. Çoğu zaman zararsız görünür — ta ki `"3 elma"` gibi bir değer `TypeError` fırlatana kadar.

## strict_types: pazarlık edilemez

Bu yüzden yıllardır her PHP dosyamın ilk satırı şudur:

```php
declare(strict_types=1);
```

Bu satırla PHP artık tür uyuşmazlığını sessizce düzeltmez; `TypeError` fırlatır. Hatayı production'da değil, fonksiyonu çağırdığınız anda görürsünüz. "Esneklik" diye sunulan davranış, aslında hataları ileri bir tarihe erteleyen bir borçtur — `strict_types` o borcu kapatır.

## Tür doğru, değer hâlâ sınanmalı

Tip bildirimi `int` der; ama "sıfırdan büyük int" demez. Bir değişkenin türünü ve içeriğini incelemek için hâlâ en hızlı aracım `var_dump()`:

```php
var_dump(3.14); // float(3.14)
```

Tip sistemi türü garanti eder; değerin iş kuralına uygunluğunu garanti etmez. Tür dayatma ile değer doğrulamasını ayrı tutmak gerekiyor: biri "bu bir sayı mı" sorusunu, diğeri "bu sayı geçerli bir yaş mı" sorusunu yanıtlar.

## Özet

PHP'nin gevşek tip sistemi bir kolaylık gibi pazarlanır; ama denetlenmediğinde bir belirsizlik kaynağıdır. Benim yaklaşımım net: `declare(strict_types=1)` her dosyada, tip bildirimi her fonksiyonda, açık cast her dönüşümde. Dil size türleri düşünmeme özgürlüğü veriyor — ben o özgürlüğü geri verip türleri yeniden görünür kılmayı tercih ediyorum. Uzun ömürlü bir kod tabanında bu küçük disiplinin getirisi, zamanla katlanarak büyüyor.
