PHP, seperti yang kita ketahui, memiliki ketikan yang lemah . Bagi yang tidak, PHP.net mengatakan:
PHP tidak memerlukan (atau mendukung) definisi tipe eksplisit dalam deklarasi variabel; tipe variabel ditentukan oleh konteks di mana variabel digunakan.
Suka atau benci, PHP membuat ulang variabel saat itu juga. Jadi, kode berikut ini valid:
$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)
PHP juga memungkinkan Anda untuk melemparkan variabel secara eksplisit, seperti:
$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"
Itu semua keren ... tetapi, untuk kehidupan saya, saya tidak dapat membayangkan alasan praktis untuk melakukan ini.
Saya tidak punya masalah dengan pengetikan yang kuat dalam bahasa yang mendukungnya, seperti Java. Tidak apa-apa, dan saya benar-benar memahaminya. Juga, saya menyadari - dan sepenuhnya memahami kegunaan - tipe mengisyaratkan dalam parameter fungsi.
Masalah yang saya miliki dengan tipe casting dijelaskan oleh kutipan di atas. Jika PHP dapat bertukar tipe sesuka hati , ia dapat melakukannya bahkan setelah Anda memaksakan suatu tipe; dan dapat melakukannya on-the-fly ketika Anda membutuhkan jenis tertentu dalam sebuah operasi. Itu membuat yang berikut ini valid:
$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"
Jadi apa gunanya?
Ambil contoh teoretis dari dunia ini di mana casting tipe yang ditentukan pengguna masuk akal dalam PHP :
- Anda memaksa variabel pemeran
$foo
sebagaiint
→(int)$foo
. - Anda mencoba untuk menyimpan nilai string dalam variabel
$foo
. - PHP melempar pengecualian !! ← Itu masuk akal. Tiba-tiba alasan casting tipe yang ditentukan pengguna ada!
Fakta bahwa PHP akan beralih hal-hal sesuai kebutuhan membuat titik dari tipe casting yang didefinisikan pengguna tidak jelas. Misalnya, dua contoh kode berikut ini setara:
// 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;
Setahun setelah awalnya mengajukan pertanyaan ini, tebak siapa yang mendapati dirinya menggunakan typecasting di lingkungan praktis? Hormat kami.
Syaratnya adalah untuk menampilkan nilai uang di situs web untuk menu restoran. Desain situs mengharuskan agar trailing zero dipangkas, sehingga tampilan terlihat seperti berikut:
Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3
Cara terbaik yang saya temukan untuk melakukan itu adalah membuang variabel sebagai pelampung:
$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;
PHP memotong nol trailing float, dan kemudian menampilkan kembali float sebagai string untuk penggabungan.
(string)
gips di mana-mana ?
$intval.'bar'
melempar pengecualian, saya masih tidak setuju. Itu tidak membuang pengecualian dalam bahasa apa pun. (Semua bahasa yang saya tahu melakukan pemeran otomatis atau a .toString()
). Jika Anda mengatakan $intval = $stringval
melempar pengecualian, maka Anda berbicara tentang bahasa yang sangat diketik. Saya tidak bermaksud terdengar kasar, jadi, maaf jika saya melakukannya. Saya hanya berpikir itu bertentangan dengan apa yang digunakan oleh setiap pengembang, dan jauh, jauh lebih tidak nyaman.