PHP'nin her gün kullandığınız sekiz türü vardır: int, float, string, bool, array, object, null, artı bir yerden bir yere geçirdiğiniz fonksiyonlar için callable. Bir değişkenin sabit bir türü yoktur; mevcut değerinin türü vardır. var_dump($x) hem türü hem değeri gösterir, gettype($x) ise türü string olarak döndürür.
İlk sütun gettype(), ikincisi get_debug_type(). Bir değeri kendinizinkiyle değiştirip tekrar çalıştırın. Birkaç adda anlaşamazlar: gettype tarihsel nedenlerle integer, double ve boolean der; get_debug_type ise tür bildirimlerindeki adları (int, float, bool) kullanır ve bir nesne için sınıf adını verir.
Bir bakışta PHP türleri
| Tür | Örnek | Notlar |
|---|---|---|
int | 42, -7, 0x1A, 1_000_000 | tam sayılar, modern sistemlerde 64 bit |
float | 3.14, 1.5e3 | ondalıklı sayılar, her dilde olduğu gibi kesin değil |
string | "hi", 'hi' | karakterlerin değil, baytların dizisi |
bool | true, false | büyük/küçük harfe duyarsız (TRUE da çalışır) |
array | [1, 2], ["a" => 1] | sıralı eşleme: liste ve sözlük bir arada |
object | new User(), new stdClass() | bir sınıfın örneği |
null | null | null türünün tek değeri; ayrıca "değer atanmamış" |
callable | 'strlen', fn($x) => $x * 2 | çağırabileceğiniz her şey |
iterable | bir dizi veya bir Traversable nesnesi | foreach ifadesinin kabul ettiği şey |
resource | fopen() sonucu | PHP dışındaki bir şeye tanıtıcı |
var_dump ile değerleri incelemek
var_dump, elinizde gerçekten ne olduğunu görmenin aracıdır. Türü, değeri ve stringler için bayt cinsinden uzunluğu yazdırır:
echo ilk üçü için 10 yazdırır ve farkı gizlerdi. string(5) "café" içindeki uzunluk baytları sayar; ASCII dışı metinlerde strlen ile mb_strlen sonuçlarının farklı olmasının nedeni budur.
Tam sayılar ve float'lar
Tam sayı, ondalıksız bir sayıdır. Değişmezlerde okunabilirlik için alt çizgi ve onaltılık, sekizlik ve ikilik gösterim kullanılabilir. Float, ondalık noktası veya üssü olan her sayıdır ve her dilde olduğu gibi çoğu ondalığı yaklaşık olarak saklar:
Float'ları asla == ile karşılaştırmayın; farkı küçük bir toleransla karşılaştırın ya da önce iki tarafı da yuvarlayın. Para için tam kuruşları tam sayı olarak saklayın.
Boolean'lar ve hangi değerlerin false olduğu
Bir bool, true veya false olur. PHP'nin bir koşul beklediği yerde (if, while, !) her değer bool'a çevrilir ve kısa bir değer listesi false sayılır: false, 0, 0.0, "", "0", [] ve null. Geri kalan her şey true olur. Tablo her değeri türüyle, bool dönüşümüyle ve sayısal olup olmadığıyla gösterir:
| $x | gettype | bool | is_numeric |
|---|---|---|---|
| 0 | |||
| 1 | |||
| -1 | |||
| 0.0 | |||
| 1.5 | |||
| "0" | |||
| "" | |||
| " " | |||
| "0.0" | |||
| "10" | |||
| "1e1" | |||
| "abc" | |||
| "null" | |||
| true | |||
| false | |||
| null | |||
| [] | |||
| [0] |
Sürprizler "0.0", " " ve "null" değerleridir: üçü de "0" dışında boş olmayan stringlerdir, bu yüzden true olurlar ve if ($value) onlar için gövdesini çalıştırır.
Diziler, nesneler ve null
Bir dizi, tam sayı veya string anahtarlar altında her türden değeri bir arada tutar. Nesne, bir sınıfın örneğidir; stdClass hızlı nesneler için PHP'nin boş sınıfıdır ve (object) bir diziyi nesneye çevirir. null "değer yok" demektir:
is_* fonksiyonlarıyla tür kontrolü
Her türün true veya false döndüren bir test fonksiyonu vardır. is_numeric, is_int fonksiyonundan farklıdır: sayısal stringleri de kabul eder; form girdisini kontrol ederken istediğiniz de budur.
Diğerleri: is_bool, is_array, is_object, is_null, is_callable, is_iterable ve belirli bir sınıf için $x instanceof ClassName.
Tür dönüşümü ve katı türler
Bir operatör farklı bir türe ihtiyaç duyduğunda PHP türleri otomatik olarak dönüştürür. Aritmetikte kullanılan sayısal bir string sayıya dönüşür, . ise sayıları stringe çevirir. Hiç sayısal olmayan bir string toplanamaz ve PHP 8 bir TypeError fırlatır:
Dosya declare(strict_types=1); ile başlamadıkça türü belirtilmiş parametreler de dönüştürülür. Başlıyorsa, yanlış skaler türle yapılan bir çağrı dönüştürülmek yerine başarısız olur:
Bilerek dönüştürmek için cast kullanın: (int) "42", (float) "3.5", (string) 10, (bool) "0". Tür dönüştürme sayfası her cast işlemini ve uç durumlarını anlatır.
Sık yapılan hata: farklı türleri == ile karşılaştırmak
== karşılaştırmadan önce dönüştürdüğü için farklı türlerdeki iki değer hatalara yol açacak şekillerde "eşit" olabilir; örneğin "1e1" == "10" (ikisi de 10 sayısıdır) ya da null == false. Dönüşüm istemiyorsanız aynı türü de şart koşan === kullanın:
PHP 8 en kötü durumu düzeltti: "abc" == 0 eskiden true idi, artık false; çünkü sayısal olmayan bir string, string olarak karşılaştırılıyor. Tabloların tamamı karşılaştırma operatörleri sayfasında.
Sıkça Sorulan Sorular
PHP'de bir değişkenin türünü nasıl kontrol ederim?
var_dump($x) türü ve değeri yazdırır, örneğin int(5). gettype($x) tür adını string olarak döndürür ("integer"), get_debug_type($x) ise modern adı döndürür ("int" ya da nesneler için sınıf adı). Tek bir türü test etmek için is_int, is_string, is_array ve diğer is_* fonksiyonlarını kullanın.
gettype neden float için "double" döndürüyor?
Tarihsel nedenlerle gettype() float'ları "double", tam sayıları "integer" olarak bildirir. PHP 8'de eklenen get_debug_type() ise tür bildirimlerinde yazdığınız adların aynısı olan "float" ve "int" değerlerini döndürür.
PHP'de hangi değerler false sayılır?
Bool'a çevrildiğinde şunlar false olur: false, 0, 0.0, "", "0", [] ve null. "0.0", " " ve "false" dahil geri kalan her şey true olur.
PHP'de en büyük tam sayı nedir?
64 bit sistemlerde 9223372036854775807 olan PHP_INT_MAX. Bunu aşacak şekilde toplama yapmak başa sarmaz: sonuç bir float olur ve hassasiyet kaybeder.
PHP güçlü mü yoksa zayıf türlü mü?
PHP dinamik türlüdür ve varsayılan olarak, yapabildiğinde türleri dönüştürür ("10" + 5 sonucu 15). Dosyanın başında declare(strict_types=1); varsa, o dosyadaki türü belirtilmiş fonksiyon çağrıları yanlış skaler türleri dönüştürmek yerine bir TypeError ile reddeder.