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, $varstring türünde bir değişken haline gelir. $var değişkenine bir int değer atanırsa, $varint 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:
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.
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.
echo, print, dizge çözümlemesi veya dizge birleştirme işleci kullanılan bağlamlardır.
Bu bağlamlarda değer string olarak yorumlanır. Değer yorumlanabilir değilse TypeError oluşur.. PHP 7.4.0 öncesinde E_RECOVERABLE_ERROR
hatası oluşurdu.
Üç terimli işleç veya mantıksal işleçlerin kullanıldığı koşullu deyimler içeren bağlamlardır.
Bu bağlamlarda değer bool türünde ele alınır.
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.
Karşılaştıma işleçleri kullanılan bağlamlardır.
Bu bağlamlarda görülen tür dönüşümleri Çeşitli Türlerin Karşılaştırılması tablosunda açıklanmıştır.
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.
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.
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:
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
?>
İstenen türün ismi yaylı ayraçlar arasında türü çarpıtılacak değişkenin önüne yazılır.
<?php
$foo = 10; // $foo bir tamsayıdır
$bar = (bool) $foo; // $bar mantıksal türdedir
?>
İ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üşümBilginize:
(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.
PHP 8.0.0 ve sonrasında (real)
dönüşüm takma adının kullanımı önerilmemektedir.
(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.
(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:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
Normal dizgelerin ikil dizgelere dönüştürülmesi:
<?php
$binary = (binary) $string;
$binary = b"ikil dizge";
?>
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:
<?php
$foo = 10; // $foo integer türündedir
$str = "$foo"; // $str string türündedir
$fst = (string) $foo; // $fst de string türündedir
// "bunlar aynı" basar
if ($fst === $str) {
echo "bunlar aynı";
}
?>
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.<?php
$a = 'car'; // $a bir dizgedir
$a[0] = 'b'; // $a hala bir dizgedir
echo $a; // bar
?>