Jawaban:
intval()dapat melewati basis yang akan dikonversi. (int)tidak bisa.
int intval( mixed $var [, int $base = 10 ] )
$i++itu salah dalam warna merah. Tapi itu harus lebih lambat !!
$i++. Maksud kamu apa? Ketika Anda mengatakan "Tapi itu harus lebih lambat !!" apa yang kamu bandingkan
(int)typecast lebih cepat x 2! (int): Ideone.com/QggNGc , intval(): ideone.com/6Y8mPN
Satu hal yang perlu diperhatikan tentang perbedaan antara (int)dan intval(): intval()memperlakukan variabel yang sudah intdan floattidak memerlukan konversi, terlepas dari argumen dasar (setidaknya untuk PHP 5.3.5). Perilaku ini bukan yang paling jelas, seperti yang tercantum dalam komentar di halaman PHP doc dan tanpa malu-malu mengulangi di sini:
$test_int = 12;
$test_string = "12";
$test_float = 12.8;
echo (int) $test_int; // 12
echo (int) $test_string; // 12
echo (int) $test_float; // 12
echo intval($test_int, 8); // 12 <-- WOAH!
echo intval($test_string, 8); // 10
echo intval($test_float, 8) // 12 <-- HUH?
The base parameter has no effect unless the var parameter is a string.Kemudian lagi halaman itu tampaknya diperbarui empat hari yang lalu, jadi mungkin itulah yang ditambahkan.
intval(12,8)akan memberikan jawaban bahwa ketika dikonversi ke string tanpa format akan terlihat seperti basis 8 jumlahnya salah. Apa yang Anda harapkan dari intval(12,16)karena tidak bisa membuat int c?
Maaf untuk necroing, saya hanya ingin melihat apakah / bagaimana PHP7 berpengaruh pada pertanyaan ini:
$ php -v
PHP 7.0.4-5+deb.sury.org~trusty+1 (cli) ( NTS )
Ujian:
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = (int) '1'; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3279.1121006012 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = intval('1'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "5379.3351650238 ms"
Seperti yang Anda lihat, casting jelas lebih cepat, hampir 100%
Tetapi saya harus meningkatkan jumlah loop menjadi 100 juta sebelum perbedaannya hanya dalam hitungan detik, yaitu ketika saya akan benar-benar mulai memperhatikan kinerja, dalam banyak kasus.
Jadi saya akan tetap menggunakan intvalfungsi, karena casting adalah sedikit keajaiban bahasa yang terjadi. Bahkan jika intvalmenggunakan casting di belakang layar, jika ada bug yang ditemukan dengan casting, dan untuk beberapa alasan itu tidak bisa diperbaiki (kompatibilitas mundur?), Maka mereka setidaknya bisa memperbaiki intvaluntuk melakukan tugasnya.
Pembaruan (PHP 7.1 + Kasing ekstra):
$ php -v
PHP 7.1.0RC6 (cli) (built: Nov 9 2016 04:45:59) ( NTS )
$ php -a
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = (int) '1'; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3583.9052200317 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = intval('1'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "3569.0960884094 ms"
php > $start_ts = microtime(true); for($i = 0; $i < 100000000; $i++) { $a = '1' + 0; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "1641.7920589447 ms"
Tampak seperti 7.1 dioptimalkan intval, dan '1' + 0 sekarang pemenang kontes kecepatan ini :) aku masih tetap menggunakan intvalpula
+0var ... tidak yakin apakah pemeran implisit di sini lebih cepat daripada yang eksplisit.
+0menang ... itu hack sangat kotor
v5.5.34hasil saya berada 9191.0059452057 ms, 23307.397127151 msdan 11483.719110489 msmasing-masing. Jadi sebelum PHP 7, casting adalah yang tercepat.
$a = '1' + 0;dan saya yakin paling tidak pernah berpikir untuk melakukannya seperti itu
Saya pikir setidaknya ada satu perbedaan: dengan intval , Anda dapat menentukan basis mana yang harus digunakan sebagai parameter kedua (basis 10 secara default):
var_dump((int)"0123", intval("0123"), intval("0123", 8));
akan membuat Anda:
int 123
int 123
int 83
intval("2g", 17) = 50 = 2*17 + 16
36, seperti di intval("g", 36) //16. Nilai apa pun yang lebih besar dari 36 menghasilkan 0. Itu menunjukkan bahwa kami dapat menggunakan semua 0-9 plus karakter az untuk basis kustom kami, seperti intval("z",36) //35. Juga, perlu dicatat bahwa parameter pertama adalah case-insensitive .
Salah satu properti yang berguna intvaladalah bahwa - karena ini adalah fungsi dan bukan konstruksi bahasa - dapat dilewatkan sebagai argumen ke fungsi yang mengharapkan fungsi. Anda tidak dapat melakukan ini dengan (int).
Sebagai contoh, saya telah menggunakannya untuk membersihkan integer untuk dimasukkan ke dalam IN()klausa SQL dengan meneruskannya ke array_map. Berikut ini sebuah contoh:
$ids = implode(",", array_map('intval', $_POST['array_of_integers']));
$sql = "SELECT * FROM table WHERE ids IN ($ids)";
array_map(function($n){return (int)$n;}, $_POST['array_of_integers'])
Kuning benar dan jika saya dapat menambahkan jenis informasi yang berguna casting (menambahkan "(int)" sebelum ekspresi Anda) adalah 300 hingga 600% lebih cepat dari intval. Jadi, jika tujuan Anda bukan untuk berurusan dengan basis selain desimal, saya sarankan menggunakan:
(int) $something
Hal yang intvaltidak dilakukan oleh pemeran sederhana adalah konversi basis:
int intval ( mixed $var [, int $base = 10 ] )
Jika basisnya 10, intvalharus sama dengan gips (kecuali Anda akan menjadi nitpicky dan menyebutkan bahwa satu membuat panggilan fungsi sementara yang lain tidak). Seperti yang tercantum pada halaman manual :
Aturan umum dari integer casting berlaku.