PHP, çoğumuzun bildiği gibi, yazarak zayıf . Yapmayanlar için, PHP.net diyor ki:
PHP değişken bildiriminde açık tür tanımı gerektirmez (veya desteklemez); değişkenin türü değişkenin kullanıldığı bağlamda belirlenir.
Sevin ya da nefret et, PHP anında değişkenleri tekrar yayınlar. Bu nedenle, aşağıdaki kod geçerlidir:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHP ayrıca açıkça şöyle bir değişken atamanıza izin verir:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
Hepsi harika… ama benim hayatım boyunca, bunu yapmak için pratik bir neden düşünemiyorum.
Java gibi, onu destekleyen dillerde yazarken bir sorunum yok. Bu iyi ve ben tamamen anlıyorum. Ayrıca, fonksiyon parametrelerindeki tip ipucunun ne kadar yararlı olduğunun farkındayım - ve tamamen anlıyorum .
Tip döküm ile ilgili problemim yukarıdaki alıntı ile açıklanmıştır. PHP, istediği zaman türleri değiştirebilirse , bir türü kullanmaya zorladıktan sonra bile yapabilir ; ve bir işlemde belirli bir türe ihtiyacınız olduğunda bunu anında yapabilir . Bu, aşağıdakileri geçerli kılar:
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
Öyleyse amaç ne?
Bu, kullanıcı tanımlı tür dökümünün PHP'de anlamlı olduğu bir dünyaya ilişkin teorik örneği ele alalım :
- Cast değişkenini →
$foo
olarak zorlarsınız .int
(int)$foo
- Değişkende bir dize değeri kaydetmeye çalışıyorsunuz
$foo
. - PHP bir istisna atar! ← Bu mantıklı olur. Birdenbire kullanıcı tanımlı tip dökümün nedeni var!
PHP'nin işleri gerektiği gibi değiştireceği gerçeği, kullanıcı tanımlı tip döküm belirsizliğini işaret eder. Örneğin, aşağıdaki iki kod örneği eşdeğerdir:
// example 1
$foo = 0;
$foo = (string)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
// example 2
$foo = 0;
$foo = (int)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;
Başlangıçta bu soruyu sorduktan bir yıl sonra, kendini pratik bir ortamda typecasting kullanarak kim buldu? Saygılarımla.
Bir gereklilik, bir restoran menüsünde bir web sitesinde para değerlerini göstermekti. Sitenin tasarımı, takip eden sıfırların kırpılmasını gerektirdi, böylece ekran aşağıdaki gibi görünüyordu:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
Değişkeni bir şamandıra olarak atmak için bu atıkları yapmanın en iyi yolu:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP, float'ın sondaki sıfırlarını keser ve ardından float'ı birleştirme için bir dize olarak yeniden ifade eder.
(string)
yayın yapmak ister misin ?
$intval.'bar'
istisna atarsan, hala aynı fikirde değilim. Bu herhangi bir dilde bir istisna atmaz. (Bildiğim tüm diller ya otomatik bir ya da a .toString()
). Bir $intval = $stringval
istisna atarsanız, o zaman kesinlikle yazılmış bir dilden bahsediyorsunuz. Kaba görünmek istemedim, öyleyse özür dilerim. Sadece her geliştiricinin alıştığı şeye aykırı olduğunu ve çok daha az kullanışlı olduğunu düşünüyorum.