PHP'de her değerin bir tipi vardır ve temel tipler şunlardır: null, bool (mantıksal), int (tamsayı), float (ondalıklı sayı), string (metin), array (dizi), object (nesne), callable ve resource. PHP dinamik tipli bir dildir: bir değişkenin tipini bildirmeniz gerekmez, tip içindeki değere göre çalışma zamanında belirlenir. Bir değerin tipini ve içeriğini görmek için var_dump(), yalnızca tip adını almak için get_debug_type() kullanılır.

Bu yazı her tipin temel kurallarını, tipler arası dönüşümü ve en sık karşılaşılan şaşırtıcı davranışları (yanlış sayılan değerler, tamsayı taşması, ondalıklı sayı hassasiyeti, sayısal metinler) PHP 8.5.12 ile çalıştırılmış örneklerle özetliyor. Her tipin derinlemesine anlatımı serinin ilgili yazılarında; tamamı için PHP öğrenme rehberi sayfasına bakın.

PHP veri tiplerine genel bakış

PHP veri tiplerine genel bakış: null, bool, 42, -7, 0x1A, float

Aşağıdaki örnek, yedi yaygın tipin var_dump() çıktısını gösteriyor. var_dump() tipi ve değeri birlikte yazar; metinlerde parantez içindeki sayı karakter değil bayt uzunluğudur. Dizi ve nesneler iç içe girintilerle açılır.

php
<?php
var_dump(null);
var_dump(true);
var_dump(42);
var_dump(3.14);
var_dump('Ankara');
var_dump([1, 'iki']);
var_dump(new stdClass);
text
NULL
bool(true)
int(42)
float(3.14)
string(6) "Ankara"
array(2) {
  [0]=>
  int(1)
  [1]=>
  string(3) "iki"
}
object(stdClass)#1 (0) {
}
TipÖrnek değerKısa açıklama
nullnullTek değeri olan tip; tanımsız ve unset edilmiş değişkenler de null olur
booltrue, falseMantıksal doğru veya yanlış
int42, -7, 0x1Aİşaretli tamsayı; boyutu platforma bağlı, 64 bit sistemde genellikle 8 bayt
float3.14, 1.2e3IEEE 754 çift hassasiyetli ondalıklı sayı
string'Ankara'Bayt dizisi; kodlama bilgisi taşımaz
array[1, 'a' => 2]Sıralı anahtar-değer haritası
objectnew stdClassBir sınıfın örneği
callable'strlen', fn() => 1Çağrılabilir değer
resourcefopen() sonucuDış kaynak tutamacı (dosya, akış)

Bunların dışında iterable, mixed, void, never gibi adlar da görürsünüz; bunlar değer tipi değil, fonksiyon ve özellik bildirimlerinde kullanılan tip bildirimi kavramlarıdır ve tip bildirimleri yazısında anlatılıyor.

Tip kontrolü: gettype, get_debug_type ve is_* fonksiyonları

Bir değerin tipini metin olarak almanın iki yolu vardır. Eski gettype() fonksiyonu tarihsel nedenlerle bazı tipler için farklı adlar döndürür: ondalıklı sayılar için "double", mantıksal değerler için "boolean", tamsayılar için "integer" ve null için büyük harfli "NULL". Nesnelerde ise sınıf adını değil yalnızca "object" yazar. PHP 8.0 ile gelen get_debug_type() ise tip bildirimlerinde kullanılan adları ve nesneler için tam sınıf adını verir.

php
<?php
$degerler = [null, true, 42, 3.14, 'metin', [], new stdClass, new DateTime('2026-01-01')];

foreach ($degerler as $d) {
    printf("%-10s %s\n", gettype($d), get_debug_type($d));
}
text
NULL       null
boolean    bool
integer    int
double     float
string     string
array      array
object     stdClass
object     DateTime

Bir değerin belirli bir tipte olup olmadığını sınamak için kılavuz bu iki fonksiyonu değil is_int(), is_string(), is_array(), is_bool(), is_null(), is_float(), is_object() gibi is_* fonksiyonlarını önerir. is_numeric() ise tipten bağımsız olarak değerin sayı veya sayısal metin olup olmadığını söyler. Nesnelerin belirli bir sınıftan olup olmadığını instanceof ile kontrol edersiniz.

bool: hangi değerler false sayılır?

bool tipinin yalnızca iki değeri vardır: true ve false; ikisi de büyük-küçük harfe duyarsızdır. Asıl önemli konu, başka bir tipteki değerin if gibi mantıksal bir bağlamda nasıl yorumlandığıdır. Kılavuza göre şu değerler false sayılır: false'un kendisi, 0, 0.0 ve -0.0, boş metin "" ve "0" metni, elemanı olmayan dizi ve null. Geri kalan her şey, negatif sayılar ve NAN dahil, true sayılır.

php
<?php
var_dump((bool) 0);          // çıktı: bool(false)
var_dump((bool) 0.0);        // çıktı: bool(false)
var_dump((bool) '');         // çıktı: bool(false)
var_dump((bool) '0');        // çıktı: bool(false)
var_dump((bool) []);         // çıktı: bool(false)
var_dump((bool) null);       // çıktı: bool(false)

var_dump((bool) -1);         // çıktı: bool(true)
var_dump((bool) '0.0');      // çıktı: bool(true)
var_dump((bool) 'false');    // çıktı: bool(true)
var_dump((bool) ' ');        // çıktı: bool(true)
var_dump((bool) [0]);        // çıktı: bool(true)

int: tamsayılar, taşma ve bölme

int: tamsayılar, taşma ve bölme

Tamsayılar onluk, onaltılık (0x), sekizlik (0 veya PHP 8.1'den beri 0o) ve ikilik (0b) tabanda yazılabilir. PHP 7.4'ten beri okunabilirlik için rakamlar arasına alt çizgi konabilir: 1_000_000. PHP işaretsiz tamsayı desteklemez. Tamsayının boyutu platforma bağlıdır; 64 bit sistemlerde PHP_INT_MAX değeri 9223372036854775807'dir.

Bir değer tamsayı sınırını aştığında PHP hata vermez, sonucu sessizce float tipine çevirir. Bu, çok büyük kimlik numaralarıyla çalışırken hassasiyet kaybına neden olabilir. PHP'de ayrı bir tamsayı bölme operatörü de yoktur: / iki tamsayı tam bölünüyorsa int, aksi hâlde float döndürür. Tamsayı bölümü için intdiv() kullanılır; (int) dönüşümü ise sıfıra doğru yuvarlar, yani hem 3.99 hem -3.99 için ondalık kısmı atar.

php
<?php
var_dump(0x1A);              // çıktı: int(26)
var_dump(0o17);              // çıktı: int(15)
var_dump(0b1010);            // çıktı: int(10)
var_dump(1_000_000);         // çıktı: int(1000000)

var_dump(PHP_INT_MAX + 1);   // çıktı: float(9.223372036854776E+18)
var_dump(7 / 2);             // çıktı: float(3.5)
var_dump(8 / 2);             // çıktı: int(4)
var_dump(intdiv(7, 2));      // çıktı: int(3)
var_dump((int) 3.99);        // çıktı: int(3)
var_dump((int) -3.99);       // çıktı: int(-3)

float: ondalıklı sayılarda hassasiyet

PHP ondalıklı sayılar için genellikle IEEE 754 çift hassasiyet biçimini kullanır. Kılavuzun vurguladığı kritik nokta şudur: 0.1 veya 0.7 gibi onluk tabanda kısa görünen sayıların ikilik tabanda tam karşılığı yoktur. Bu yüzden 0.1 + 0.2 tam olarak 0.3 değildir ve iki ondalıklı sayıyı == ile karşılaştırmak güvenilir değildir. Karşılaştırma için farkın çok küçük bir eşikten (epsilon) küçük olup olmadığına bakılır.

php
<?php
var_dump(0.1 + 0.2 == 0.3);                          // çıktı: bool(false)
var_dump(0.1 + 0.2);                                 // çıktı: float(0.30000000000000004)
var_dump(abs((0.1 + 0.2) - 0.3) < PHP_FLOAT_EPSILON); // çıktı: bool(true)
echo (int) ((0.1 + 0.7) * 10), "\n";                 // çıktı: 7

$nan = sqrt(-1);
var_dump($nan == $nan);    // çıktı: bool(false)
var_dump(is_nan($nan));    // çıktı: bool(true)

Aynı nedenle bilinmeyen bir kesirli sonucu doğrudan (int) ile tamsayıya çevirmek beklenmedik değerler üretir: (0.1 + 0.7) * 10 içeride 7.999... olduğu için 7 yazılır. Para gibi kesin hesap gereken yerlerde tutarları kuruş cinsinden tamsayı olarak saklamak veya kılavuzun önerdiği keyfi hassasiyetli matematik (BCMath) fonksiyonlarını kullanmak daha güvenlidir. NAN değeri kendisi dahil hiçbir değere eşit olmadığından kontrolü is_nan() ile yapılır.

string, array ve object tiplerine kısa bakış

PHP'de string bir bayt dizisidir ve hangi karakter kodlamasında olduğuna dair bilgi taşımaz. strlen() ve substr() gibi fonksiyonlar baytlarla çalışır; Türkçe karakterler UTF-8'de iki bayt tuttuğu için bu fonksiyonlar karakter sayısıyla farklı sonuç verir. Metinlerle çalışmanın ayrıntıları string fonksiyonları yazısında, çok baytlı karakterler mbstring yazısında anlatılıyor.

array aslında sıralı bir haritadır: anahtarlar tamsayı veya metin olabilir ve aynı yapı liste, sözlük, yığın veya kuyruk gibi kullanılabilir. Ayrıntılar dizi temelleri yazısında. object ise bir sınıfın örneğidir ve new ile oluşturulur; sınıflar sınıf ve nesne yazısında anlatılıyor.

null ve resource tipleri

null, PHP'nin "birim tipi"dir: tek bir değeri vardır, o da büyük-küçük harfe duyarsız null sabitidir. Tanımsız değişkenler ve unset() ile silinen değişkenler de okunduğunda null değerini verir. Eskiden bir değeri null yapmak için kullanılan (unset) dönüşümü PHP 7.2'de kullanımdan kaldırıldı ve PHP 8.0'da tamamen silindi; bunun yerine doğrudan $x = null atayın. Bir değerin null olup olmadığını is_null() veya === null ile kontrol edersiniz.

resource ise açık bir dosya, akış veya bağlantı gibi dış bir kaynağa tutamaç tutan özel bir tiptir ve yalnızca belirli fonksiyonlar tarafından oluşturulur. Kaynağa artık hiçbir değişken başvurmadığında Zend Engine onu otomatik olarak serbest bırakır, bu yüzden elle kapatmak çoğu zaman zorunlu değildir; yine de dosyaları işiniz bitince kapatmak iyi bir alışkanlıktır. Kapatılan bir kaynak tipini korur ama durumu "closed" olarak raporlanır:

php
<?php
$akis = fopen('php://memory', 'r+');
echo get_debug_type($akis), "\n";   // çıktı: resource (stream)
echo gettype($akis), "\n";          // çıktı: resource

fclose($akis);
echo get_debug_type($akis), "\n";   // çıktı: resource (closed)
echo gettype($akis), "\n";          // çıktı: resource (closed)

Bir kaynağı metne çevirirseniz "Resource id #1" biçiminde bir metin alırsınız; kılavuz bu biçime güvenilmemesi gerektiğini, yalnızca betik boyunca benzersiz olduğunun garanti edildiğini belirtir. Dosya akışlarıyla çalışmak dosya okuma ve yazma yazısında anlatılıyor.

Tip dönüşümü: otomatik ve açık dönüşüm

Tip dönüşümü: otomatik ve açık dönüşüm: Sayısal metinler, Açık tür dönüşümü (cast), PHP 8.5 ile gelen dönüşüm uyarıları

Bir değer, tipinin desteklemediği bir işlemde kullanıldığında PHP onu uygun bir tipe çevirmeye çalışır; kılavuz buna type juggling der. Dönüşüm bağlama göre yapılır: aritmetik operatörlerde sayıya, echo ve birleştirmede metne, if ve mantıksal operatörlerde bool tipine çevrilir. Önemli bir ayrıntı: dönüşüm yalnızca o işlem için yapılır, değişkenin kendisinin tipi değişmez.

Sayısal metinler

Bir metin tamamen sayı olarak okunabiliyorsa "sayısal metin" (numeric string) sayılır; baştaki ve sondaki boşluklara izin verilir. Sayıyla başlayıp başka karakterlerle devam eden metinler ise "baştan sayısal" (leading numeric) metindir. Aritmetik işlemde sayısal metin sorunsuz dönüşür; baştan sayısal metin dönüşür ama PHP uyarı verir; hiç sayısal olmayan bir metin ise PHP 8'de TypeError fırlatır.

php
<?php
var_dump('10' + 5);          // çıktı: int(15)
var_dump('1.5' + 1);         // çıktı: float(2.5)
var_dump(' 42 ' + 0);        // çıktı: int(42)
var_dump(is_numeric('1e3')); // çıktı: bool(true)
var_dump('10 elma' + 5);
var_dump('elma' + 5);
text
int(15)
float(2.5)
int(42)
bool(true)

Warning: A non-numeric value encountered in /yol/ornek.php on line 6
int(15)

Fatal error: Uncaught TypeError: Unsupported operand types: string + int in /yol/ornek.php:7
Stack trace:
#0 {main}
  thrown in /yol/ornek.php on line 7

"1e3" gibi içinde e harfi bulunan metinlerin bilimsel gösterim olarak sayı kabul edilmesi, karşılaştırmalarda sürpriz sonuçlar doğurabilir. Bu ve == ile yapılan diğer karşılaştırmaların kuralları eşitlik ve karşılaştırma yazısında tablo hâlinde anlatılıyor.

Açık tür dönüşümü (cast)

Bir değeri belirli bir tipe kendiniz çevirmek için tip adını parantez içinde değerin önüne yazarsınız. Geçerli dönüşümler (int), (bool), (float), (string), (array) ve (object) biçimindedir. settype() fonksiyonu ise değişkenin kendisini yerinde dönüştürür. Metinden sayıya dönüşümde baştaki sayısal kısım alınır, sayısal olmayan metin 0 olur; true metne "1", false boş metne çevrilir; skaler bir değer diziye çevrildiğinde tek elemanlı bir dizi, nesneye çevrildiğinde scalar özelliği olan bir stdClass oluşur.

php
<?php
$s = '123abc';
var_dump((int) $s);         // çıktı: int(123)
var_dump((float) '2.5kg');  // çıktı: float(2.5)
var_dump((string) false);   // çıktı: string(0) ""
var_dump((string) 1.0);     // çıktı: string(1) "1"
var_dump((array) 'tek');
var_dump((object) ['ad' => 'Ece']);

$n = '25';
settype($n, 'integer');
var_dump($n);               // çıktı: int(25)
text
int(123)
float(2.5)
string(0) ""
string(1) "1"
array(1) {
  [0]=>
  string(3) "tek"
}
object(stdClass)#1 (1) {
  ["ad"]=>
  string(3) "Ece"
}
int(25)

PHP 8.5 ile gelen dönüşüm uyarıları

PHP 8.5 iki yeni uyarı getirdi. Birincisi, standart olmayan dönüşüm adları kullanımdan kaldırıldı: (integer), (boolean), (double) ve (binary) yerine sırasıyla (int), (bool), (float) ve (string) yazılmalıdır. İkincisi, tamsayı olarak temsil edilemeyen bir ondalıklı sayı (çok büyük bir değer veya NAN, INF) int tipine çevrildiğinde artık E_WARNING verilir; önceden hiçbir uyarı yoktu ve sonuç tanımsızdı.

php
<?php
var_dump((integer) '5');
text
Deprecated: Non-canonical cast (integer) is deprecated, use the (int) cast instead in /yol/ornek.php on line 2
int(5)
php
<?php
var_dump((int) NAN);
var_dump((int) 1e20);
text
Warning: The float NAN is not representable as an int, cast occurred in /yol/ornek.php on line 2
int(0)

Warning: The float 1.0E+20 is not representable as an int, cast occurred in /yol/ornek.php on line 3
int(7766279631452241920)

İkinci uyarıdaki int(7766279631452241920) sonucuna güvenmeyin: kılavuz, sınırı aşan bir ondalıklı sayının tamsayıya çevrilmesinin sonucunu tanımsız olarak niteler. PHP 8.5 ile kullanımdan kaldırılan diğer özellikler PHP 8.5 yenilikleri yazısında listeleniyor.

Uygulamalı örnek: değerin tipini açıklayan bir fonksiyon

Tip kontrolü fonksiyonlarını bir arada görmek için, kendisine verilen herhangi bir değeri kısaca tarif eden bir fonksiyon yazalım. Parametre tipi olarak mixed kullanıldı, yani her tipte değer kabul ediliyor. Gövdedeki match (true) yapısı, doğru çıkan ilk kontrolün sonucunu döndürüyor; bu kalıp koşul yapıları yazısında ayrıntılı anlatılıyor.

php
<?php
function ozetle(mixed $deger): string
{
    return match (true) {
        is_null($deger)    => 'boş (null)',
        is_bool($deger)    => 'mantıksal: ' . ($deger ? 'true' : 'false'),
        is_int($deger)     => "tamsayı: $deger",
        is_float($deger)   => "ondalıklı: $deger",
        is_numeric($deger) => "sayısal metin: '$deger'",
        is_string($deger)  => 'metin, ' . strlen($deger) . ' bayt',
        is_array($deger)   => 'dizi, ' . count($deger) . ' eleman',
        default            => get_debug_type($deger),
    };
}

foreach ([null, false, 7, 2.5, '42', 'çay', [1, 2], new ArrayObject()] as $d) {
    echo ozetle($d), "\n";
}
text
boş (null)
mantıksal: false
tamsayı: 7
ondalıklı: 2.5
sayısal metin: '42'
metin, 4 bayt
dizi, 2 eleman
ArrayObject

Sıralamanın önemine dikkat edin. is_numeric() kontrolü is_string() kontrolünden önce yazıldığı için '42' metni "sayısal metin" olarak tanındı; sıra ters olsaydı sıradan metin sayılırdı. Benzer şekilde is_int() ve is_float() önce geldiği için 7 ve 2.5 sayısal metin dalına düşmedi. "çay" kelimesinin 4 bayt çıkması, ç harfinin UTF-8'de iki bayt tuttuğunu bir kez daha gösteriyor. Hiçbir dala uymayan nesne için get_debug_type() sınıf adını döndürdü.

Sık yapılan hatalar

  • "0" metnini dolu sanmak: Mantıksal bağlamda "0" yanlıştır; formdan gelen sıfırlar boş sayılabilir.
  • Ondalıklı sayıları == ile karşılaştırmak: Hassasiyet farkı yüzünden eşit beklenen değerler eşit çıkmayabilir; epsilon ile karşılaştırın.
  • gettype() sonucuyla "float" aramak: gettype() ondalıklı sayı için "double" döndürür; tip sınamak için is_float() kullanın.
  • Bölme sonucunu tamsayı sanmak: 7 / 2 3.5 verir; tamsayı bölümü için intdiv() kullanın.
  • Büyük tamsayıların taşmasını fark etmemek: Sınırı aşan sonuç sessizce float olur ve hassasiyet kaybolur.
  • (integer) veya (double) yazmak: PHP 8.5'te kullanımdan kaldırıldı; kısa adları kullanın.

Sık Sorulan Sorular

PHP'de bir değişkenin tipini nasıl öğrenirim?

Hata ayıklarken var_dump($x) hem tipi hem değeri gösterir. Tip adını metin olarak almak için get_debug_type($x) kullanın. Koşul içinde belirli bir tipi sınamak için is_int(), is_string() gibi fonksiyonları tercih edin.

gettype() neden "double" döndürüyor?

Kılavuza göre tarihsel nedenlerle. gettype() ondalıklı sayılar için "double", tamsayılar için "integer" döndürür. PHP 8.0 ile gelen get_debug_type() bunun yerine "float" ve "int" gibi tip bildirimlerinde kullanılan adları verir.

PHP'de karakter (char) tipi var mı?

Hayır. PHP'de ayrı bir karakter veya bayt tipi yoktur; tek karakter de bir string değeridir. Kılavuz, metinlerin bayt dizisi olarak tutulmasının bu rolü üstlendiğini belirtir.

Tip dönüşümünü tamamen kapatabilir miyim?

Fonksiyon parametreleri ve dönüş değerleri için dosyanın başına declare(strict_types=1); yazarak skaler tiplerin otomatik dönüşümünü kapatabilirsiniz. Bu ayar yalnızca skaler tip bildirimleri için tanımlıdır; örneğin '10' + 5 gibi bir aritmetik işlem strict_types açıkken de 15 sonucunu verir. Ayrıntılar tip bildirimleri ve strict_types yazısında.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: PHP öğrenme rehberi · PHP eşitlik ve tip dönüşümü · PHP tip bildirimleri · PHP string fonksiyonları · PHP dizi temelleri