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

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.


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:

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

$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. Bu, dilin tarihindeki en değerli eklemelerden biri:

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:

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 sessizce 3 olana kadar.

strict_types: pazarlık edilemez

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

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():

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.

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