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, $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:

  • 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.

Dizgesel bağlamlar

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.

Mantıksal bağlamlar

Üç 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.

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.

Kaşılaştırmalı bağlamlar

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.

İş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:

  1. int
  2. float
  3. string
  4. 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.

<?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üşü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:

<?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:

<?php
$a
= 'car'; // $a bir dizgedir
$a[0] = 'b'; // $a hala bir dizgedir
echo $a; // bar
?>
Daha ayrıntılı bilgi için bkz: Karakter Karakter Dizgeye Erişim.
To Top