Tür Dönüşümü
PHP değişken bildiriminde tür tanımlamayı gerektirmez. Bu durumda
değişkenin türü saklanan değere göre saptanır. Yani,
string türünde bir değer $var değişkenine
atanırsa, $var string türünde bir değişken
haline gelir. $var değişkenine bir int
değer atanırsa, $var int türünde bir
değişken haline gelir.
PHP belli bağlamlarda bir değerin türünü otomatik olarak dönüştürmeyi
deneyebilir:
-
Sayısal
-
Dizgesel
-
Mantıksal
-
Tamsayılar ve dizge
-
Karşılaştırmalı
-
İşlevsel
Bilginize:
Bir değerin farklı bir türde yorumlanması gerektiğinde değerin kendisinde
tür değişikliği yapılmaz.
Bir değişkeni belli bir türde değerlendirilmeye zorlamak için
Tür Çarpıtma, bir
değişkenin türünü değiştirmek için ise settype()
işlevinin açıklamasına bakılabilir.
Sayısal bağlamlar
Aritmetik işleçlerin
kullanıldığı bağlamlardır.
Bu bağlamlarda, terimlerden biri float türündeyse her
iki terim float olarak ele alınır ve sonuç float
türünde olur. Aksi takdirde, terimler int olarak
yorumlanır ve sonuç int türünde olur. PHP 8.0.0 ve sonrasında,
terimlerden birinin yorumlanamaması TypeError
istisnasına yol açabilir.
Tamsayı ve dizge bağlamlar
Bitsel işleç kullanılan
bağlamlardır.
Bu bağlamlarda tüm terimler string türündeyse sonuç da
string türünde olur. Aksi takdirde, terimler int
türünde yorumlanır ve sonuç da int türünde olur. PHP 8.0.0 ve
sonrasında, terimlerden birinin yorumlanamaması
TypeError istisnasına yol açabilir.
İşlevsel bağlamlar
Bir değerin belli bir türdeki bir bağımsız değişkene veya özelliğe
atandığı veya dönüş türü bildiren bir işlevden döndürüldüğü bağlamlardır.
Bu bağlamlarda değerin bir türü olmalıdır. Bunun iki istisnası vardır.
İlk istisna: Değer int türündeyse ve bildirilen tür
float ise tamsayı gerçek sayıya dönüştürülür.
İkinci istisna: Bildirim türü sayıl
türlerden biriyse değer bir sayıl türe dönüştürülebilir, zorlayıcı tür
kipi etkinse (öntanımlıdır), değer uygun bir sayıl türe dönüştürülebilir.
Bu davranışın açıklaması aşağıda bulunabilir.
Uyarı
Dahili işlevler sayıl türleri
otomatik olarak null
'a dönüşmeye zorlar; bu davranışın PHP 8.1.0
itibariyle KULLANIMI ÖNERİLMEMEKTEDİR.
Basit tür bildirimli zorlayıcı tür kipi
-
bool türünde bildirim: değer bool türünde
değerlendirilir.
-
int türünde bildirim: dönüşüm olması gerektiği gibi ise
değer int türünde değerlendirilir. Örnek:
Sayısal dizgeler.
-
float türünde bildirim: dönüşüm olması gerektiği gibi ise
değer float türünde değerlendirilir. Örnek:
Sayısal dizgeler.
-
string türünde bildirim: değer string türünde
değerlendirilir.
Birleşim türleriyle zorlanmış tür dönüşümü
strict_types
etkin olduğunda sayıl tür bildirimlerine
örtük olarak sınırlı tür zorlamaları uygulanır. Değerin asıl türü
birleşimin (union) parçası değilse hedef tür aşağıdaki
öncelik sırasına göre belirlenir:
-
int
-
float
-
string
-
bool
Tür hem birleşimde hem de değerde mevcutsa, PHP'nin mevcut tür sınama
anlamlandırmasına uygun olarak değerin türü zorlanarak tür seçilir,
değilse birleşimin sonraki türü denenir.
Dikkat
Bir istisna olarak, değer bir dizgeyse ve hem int hem de float
birleşime dahilse tercihli tür mevcut "sayısal dizge"
anlamlandırmasına göre belirlenir. Örneğin, "42"
değeri için int seçilirken, "42.0"
değeri için float seçilir.
Bilginize:
Yukarıdaki tercih listesine dahil olmayan türler örtük zorlama için
seçilebilir hedefler değildir. Özellikle, null,
false ve true değerlere hiçbir örtük zorlama
uygulanmaz.
Örnek 1 - Birleşimin türlerinden birine zorlama örneği
<?php
// int|string
42 --> 42 // kesin tür
"42" --> "42" // kesin tür
new ObjectWithToString --> "__toString() sonucu"
// nesne int ile uyumsuz, son çare: string
42.0 --> 42 // float ile int uyumlu
42.1 --> 42 // float ile int uyumlu
1e100 --> "1.0E+100" // float; int için çok büyük, son çare: string
INF --> "INF" // float; int için çok büyük, son çare: string
true --> 1 // bool ile int uyumlu
[] --> TypeError // array ile int veya string uyumlu değil
// int|float|bool
"45" --> 45 // int sayısal dizge
"45.0" --> 45.0 // float sayısal dizge
"45X" --> true // sayısal dizge değil, son çare: bool
"" --> false // sayısal dizge değil, son çare: bool
"X" --> true // sayısal dizge değil, son çare: bool
[] --> TypeError // array ile int, float veya bool uyumlu değil
?>
Tür Çarpıtma
İstenen türün ismi yaylı ayraçlar arasında türü çarpıtılacak değişkenin
önüne yazılır.
İzin verilen çarpıtmalar:
(int)
- int türüne dönüşüm
(bool)
- bool türüne dönüşüm
(float)
- float türüne dönüşüm
(string)
- string türüne dönüşüm
(array)
- array türüne dönüşüm
(object)
- object türüne dönüşüm
(unset)
- NULL'a dönüşüm
Bilginize:
(integer)
çarpıtması (int)
için
takma addır. (boolean)
çarpıtması
(bool)
için takma addır. (binary)
çarpıtması (string)
için takma addır.
(double)
ve (real)
çarpıtması
(float)
için takma addır. Meşru tür isimleri
kullanılmayan bu çarpıtmaların kullanımı önerilmemektedir.
Uyarı
PHP 8.0.0 ve sonrasında (real)
dönüşüm takma adının
kullanımı önerilmemektedir.
Uyarı
(unset)
çarpıtması PHP 7.2.0 ve sonrasında
önerilmemektedir. (unset)
çarpıtması değişken veya
çağrıya NULL değer atanmasıyla aynıdır.
(unset)
çarpıtması PHP 8.0.0 sürümünde kaldırılmıştır.
Dikkat
(binary)
çarpıtması ve b
öneki
ileriye dönük desteklenmektedir. Halen (binary)
çarpıtması (string)
ile aynı olsa da buna
güvenilmemelidir.
Bilginize:
Çarpıtmada yaylı ayraçların içinde sekmelere ve boşluklara izin
verildiğinden aşağıdaki iki deyim eşdeğerdir:
Bilginize:
Bir değişkenin türünü string türüne çarpıtmak yerine
değişkeni çift tırnak içine almak aynı sonucu sağlar:
Belli türler arasında çarpıtma yapılırken tam olarak ne olup bittiği
açıkça belli olmayabilir. Daha fazla bilgi için şu bölümlere bakınız:
Bilginize:
PHP dizgelerde dizge içi konumlar üzerinden dizilerdeki gibi indislemeyi
desteklemektedir. Aşağıdaki örnekler tüm PHP sürümlerinde çalışır:
Daha ayrıntılı bilgi için bkz:
Karakter Karakter
Dizgeye Erişim.