PHP Dersleri #5: Veri Tipleri ve Tip Dönüşümleri
Uzmoon · · 6 dk
Bu Dersin Amacı
Bu dersin temel amacı, PHP programlama dilindeki temel skaler ve bileşik veri tiplerini tanımak, bir değişkenin türünü denetlemeyi öğrenmek ve tipler arası dönüşüm mekanizmalarını kavramaktır.
PHP Dilinde Veri Tipleri Nelerdir?
Önceki dersimizde değişkenlerin bellekte veri saklayan isimlendirilmiş alanlar olduğunu görmüştük. PHP esnek tipli (loosely typed) bir dildir; yani bir değişken oluştururken onun hangi tipte veri saklayacağını önceden belirtmeniz gerekmez. Atadığınız değere göre PHP bu türü kendiliğinden belirler. Buna karşın verinin bellekte hangi yapıda tutulduğunu bilmek, doğru işlemler yapabilmek ve yazılım hatalarının önüne geçebilmek adına kritik önem taşır.
PHP dilinde veri tipleri skaler, bileşik ve özel tipler olmak üzere üç ana kümede incelenir. Skaler tipler tek bir değer taşır. Bileşik tipler birden fazla veriyi bir arada organize ederken, özel tipler ise belirli durumlara işaret eder.
| Veri Tipi | Kategori | Tanım | Örnek |
|---|---|---|---|
| int (integer) | Skaler | Pozitif ya da negatif tam sayılar. | 42, -17 |
| float (double) | Skaler | Ondalıklı ve kesirli sayılar. | 3.14, -0.85 |
| string | Skaler | Metinsel ifadeler ve karakter dizileri. | "Web Odası" |
| bool (boolean) | Skaler | Mantıksal doğruluk durumları (true veya false). | true, false |
| array | Bileşik | Birden çok değeri tek bir yapıda toplayan diziler. | [10, 20, 30] |
| null | Özel | Değer atanmamış veya boşluğu ifade eden özel tür. | null |
Temel Veri Tiplerinin Tanımlanması ve İncelenmesi
PHP içerisinde bir değişkenin veri tipini ve taşıdığı değeri tüm ayrıntılarıyla ekrana basmak için var_dump() fonksiyonu kullanılır. Değişkenin yalnızca tip adını metin olarak almak istediğimizde ise gettype() fonksiyonu tercih edilir.
Aşağıdaki tam ve bağımsız çalışan kod örneğinde, her temel veri tipinden birer değişken tanımlanmış ve hem tip adları hem de ayrıntılı dökümleri ekrana yazdırılmıştır:
<?php
$sayi = 85;
$oran = 12.64;
$baslik = "Web Odasi PHP Egitimi";
$kayitliMi = true;
$bosVeri = null;
$sayiListesi = [5, 15, 25];
echo gettype($sayi) . "\n";
echo gettype($oran) . "\n";
echo gettype($baslik) . "\n";
echo gettype($kayitliMi) . "\n";
echo gettype($bosVeri) . "\n";
echo gettype($sayiListesi) . "\n\n";
var_dump($sayi);
var_dump($oran);
var_dump($baslik);
var_dump($kayitliMi);
var_dump($bosVeri);
var_dump($sayiListesi);
Yukarıdaki kod çalıştırıldığında üretilen çıktı:
integer
double
string
boolean
NULL
array
int(85)
float(12.64)
string(21) "Web Odasi PHP Egitimi"
bool(true)
NULL
array(3) {
[0]=>
int(5)
[1]=>
int(15)
[2]=>
int(25)
}
Veri Tiplerini Denetleme Fonksiyonları
Program akışında bir değişkenden beklenen türde değer gelip gelmediğini doğrulamak için PHP içerisinde is_* kalıbıyla başlayan yardımcı fonksiyonlar yer alır. Bu fonksiyonlar koşul denetimlerinde sıkça kullanılır ve geriye true veya false döndürür.
is_int(): Değerin tam sayı olup olmadığını sınar.is_float(): Değerin ondalıklı sayı olup olmadığını sınar.is_string(): Değerin karakter dizisi olup olmadığını kontrol eder.is_bool(): Değerin mantıksal (boolean) olup olmadığını denetler.is_null(): Değerin null olup olmadığını doğrular.is_array(): Değerin bir dizi olup olmadığını bildirir.is_numeric(): Değerin doğrudan sayı ya da sayıya dönüştürülebilir bir karakter dizisi olup olmadığını inceler.
Aşağıdaki bağımsız çalıştırılabilir örnek üzerinde bu fonksiyonların davranışını inceleyelim:
<?php
$yas = 30;
$metinFiyat = "150.75";
$durum = false;
$sehir = "Istanbul";
var_dump(is_int($yas));
var_dump(is_numeric($metinFiyat));
var_dump(is_float($metinFiyat));
var_dump(is_bool($durum));
var_dump(is_string($sehir));
Yukarıdaki kodun ürettiği çıktı:
bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
Burada $metinFiyat değişkeni tırnak içinde yazıldığı için tipi string olarak kalır; dolayısıyla is_float() sorgusunda false dönerken, sayısal bir içeriğe sahip olduğu için is_numeric() sınamasında true döner.
Tip Dönüşümleri (Type Casting)
PHP dilinde veri tipleri iki farklı biçimde dönüştürülür: PHP tarafından ihtiyaç anında arka planda uygulanan otomatik dönüşüm (type juggling) ve geliştiricinin bilinçli olarak yaptığı açık tip dönüşümü (type casting).
Otomatik Tip Dönüşümü (Type Juggling)
PHP, işlem yapılan bağlama göre veri türünü uygun biçime otomatik olarak uyarlayabilir. Örneğin bir tam sayı ile karakter dizisi ekrana yazdırılmak istendiğinde, tam sayı otomatik olarak karakter dizisi tipine bürünür.
Önemli Sürüm Bilgisi: PHP 8 ile birlikte tür uyumu daha katı hale getirilmiştir. PHP 8 öncesinde sayısal olmayan karakter dizileri matematiksel işlemlerde sessizce sıfıra dönüştürülürken, PHP 8 ve sonrasında bu durum ölümcül hata (TypeError) fırlatır. Bu nedenle harici kaynaklardan gelen verilerde açık dönüşüm uygulamak modern PHP mimarisinde zorunluluktur.
Açık Tip Dönüşümü (Explicit Casting)
Bir değişkenin türünü kesin olarak değiştirmek için ifadenin hemen soluna parantez içerisinde dönüştürülmek istenen tip belirteci yazılır:
(int)veya(integer): Hedef değeri tam sayıya çevirir.(float)veya(double): Hedef değeri ondalıklı sayıya çevirir.(string): Hedef değeri karakter dizisine çevirir.(bool)veya(boolean): Hedef değeri mantıksal türe çevirir.(array): Hedef değeri diziye çevirir.
Mantıksal (boolean) dönüşümlerde PHP belirli kurallar işletir. Aşağıdaki değerler (bool) dönüşümünde her zaman false kabul edilir:
- Tam sayı
0ve ondalıklı sayı0.0 - Boş karakter dizisi
""ve yalnızca sıfır barındıran"0"karakter dizisi - Elemanı bulunmayan boş dizi
[] - Özel
nulldeğeri
Bu değerler haricindeki her türlü dolu metin ve sıfırdan farklı sayılar true değerini üretir.
Aşağıdaki örnekte açık tip dönüşümlerinin sonuçları gösterilmektedir:
<?php
$hamSayi = "250";
$sayisalSonuc = (int)$hamSayi;
$agirlik = 74.88;
$tamsayiAgirlik = (int)$agirlik;
$kod = 502;
$metinKod = (string)$kod;
$durumSifir = (bool)0;
$durumSifirMetin = (bool)"0";
$durumBosMetin = (bool)"";
$durumDoluMetin = (bool)"Web Odasi";
var_dump($sayisalSonuc);
var_dump($tamsayiAgirlik);
var_dump($metinKod);
var_dump($durumSifir);
var_dump($durumSifirMetin);
var_dump($durumBosMetin);
var_dump($durumDoluMetin);
Yukarıdaki kodun ürettiği çıktı:
int(250)
int(74)
string(3) "502"
bool(false)
bool(false)
bool(false)
bool(true)
Sık Yapılan Hatalar
- "0" karakter dizisinin mantıksal false sayılması: PHP dilinde metin içinde yer alan
"0"değeri mantıksal türe dönüştürüldüğündefalsekabul edilir. Formlardan gelen tek basamaklı sıfır girdilerinde bu durum denetim hatalarına neden olabilir. - Ondalıklı sayıların int dönüşümünde kesilmesi: Bir
floatdeğer(int)türüne dönüştürüldüğünde en yakın tam sayıya yuvarlanmaz; virgülden sonraki kesirli kısım doğrudan atılır. Örneğin74.88değeri74olur. Yuvarlama ihtiyacındaround()fonksiyonu kullanılmalıdır. - PHP 8 hata modelinin unutulması: Eski sürümlerde çalışan ve sayısal olmayan metinlerle yapılan örtük dönüşümler, PHP 8 ve sonrasında
TypeErroroluşturur. Form ve API verilerini kullanmadan önce tür denetimi yapılmalıdır. - gettype() ile var_dump() arasındaki farkı gözden kaçırmak:
gettype()fonksiyonu yalnızca tür adını metin olarak sunarken,var_dump()değişkenin türüyle birlikte uzunluğunu ve gerçek değerini ekrana basar. Hata ayıklama süreçlerindevar_dump()kullanılmalıdır.
Alıştırma
Bir web servisinden karakter dizisi formatında gelen ürün tutarını ("349.99") ve stok adedini ("6") temsil eden iki değişken tanımlayın. Bu değerleri sırasıyla float ve int türlerine dönüştürün. Dönüşümden sonra elde edilen yeni değişkenleri var_dump() fonksiyonu ile ekranda doğrulayın.
Çözüm
<?php
$gelenTutar = "349.99";
$gelenStok = "6";
$tutar = (float)$gelenTutar;
$stok = (int)$gelenStok;
var_dump($tutar);
var_dump($stok);
Çözüm kodunun çıktısı:
float(349.99)
int(6)
Özet
Bu dersimizde PHP içerisindeki temel skaler veri tiplerini (int, float, string, bool), bileşik dizi tipini ve özel null türünü ele aldık. Değişkenlerin türünü gettype() ve is_* fonksiyonlarıyla nasıl denetleyeceğimizi inceledik. Son olarak, modern PHP 8 standartlarında güvenli veri işlemek adına (int), (float), (string) ve (bool) belirteçleriyle açık tip dönüşümü yapmayı öğrendik.