Apakah ada perbedaan khusus antara intval dan (int)?
Contoh:
$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];
Apakah ada perbedaan khusus antara dua baris kode di atas?
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/6Y8mPNSatu hal yang perlu diperhatikan tentang perbedaan antara
(int)
danintval()
:intval()
memperlakukan variabel yang sudahint
danfloat
tidak 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:sumber
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 dariintval(12,16)
karena tidak bisa membuat intc
?Maaf untuk necroing, saya hanya ingin melihat apakah / bagaimana PHP7 berpengaruh pada pertanyaan ini:
Ujian:
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
intval
fungsi, karena casting adalah sedikit keajaiban bahasa yang terjadi. Bahkan jikaintval
menggunakan 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 memperbaikiintval
untuk melakukan tugasnya.Pembaruan (PHP 7.1 + Kasing ekstra):
Tampak seperti 7.1 dioptimalkan
intval
, dan '1' + 0 sekarang pemenang kontes kecepatan ini :) aku masih tetap menggunakanintval
pulasumber
+0
var ... tidak yakin apakah pemeran implisit di sini lebih cepat daripada yang eksplisit.+0
menang ... itu hack sangat kotorv5.5.34
hasil saya berada9191.0059452057 ms
,23307.397127151 ms
dan11483.719110489 ms
masing-masing. Jadi sebelum PHP 7, casting adalah yang tercepat.$a = '1' + 0;
dan saya yakin paling tidak pernah berpikir untuk melakukannya seperti ituSaya pikir setidaknya ada satu perbedaan: dengan intval , Anda dapat menentukan basis mana yang harus digunakan sebagai parameter kedua (basis 10 secara default):
akan membuat Anda:
sumber
intval("2g", 17) = 50 = 2*17 + 16
36
, seperti diintval("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, sepertiintval("z",36) //35
. Juga, perlu dicatat bahwa parameter pertama adalah case-insensitive .Salah satu properti yang berguna
intval
adalah 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 kearray_map
. Berikut ini sebuah contoh:sumber
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
sumber
Hal yang
intval
tidak dilakukan oleh pemeran sederhana adalah konversi basis:Jika basisnya 10,
intval
harus 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 :sumber