Czy jest jakaś szczególna różnica między intval a (int)?
Przykład:
$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];
Czy jest jakaś szczególna różnica między powyższymi dwoma wierszami kodu?
intval()
można przekazać bazę, z której można dokonać konwersji. (int)
Nie mogę.
int intval( mixed $var [, int $base = 10 ] )
$i++
ma niepoprawny czerwony kolor. Ale powinno być wolniejsze !!$i++
. Co masz na myśli? Kiedy mówisz „Ale powinno być wolniej !!” co porównujesz(int)
typecast jest szybszy x 2!(int)
: Ideone.com/QggNGc ,intval()
: ideone.com/6Y8mPNJedną rzeczą, aby pamiętać o różnicy między
(int)
iintval()
:intval()
traktuje zmienne, które są jużint
S ifloat
S, która nie wymaga konwersji, niezależnie od argumentu podstawowego (od PHP 5.3.5 przynajmniej). To zachowanie nie jest najbardziej oczywiste, jak zauważono w komentarzach na stronie dokumentu PHP i bezwstydnie powtórzono tutaj:źródło
The base parameter has no effect unless the var parameter is a string.
Potem znowu strona została zaktualizowana widocznie cztery dni temu, więc być może to właśnie został dodany.intval(12,8)
które dałoby odpowiedź, że po przekształceniu w ciąg bez formatowania wyglądałoby jak podstawa 8 numer jest po prostu zły. Czego można oczekiwać,intval(12,16)
ponieważ nie może zrobić intc
?Przepraszam za nekrozę, chciałem tylko sprawdzić, czy / jak PHP7 ma wpływ na to pytanie:
Test:
Jak widać casting jest zdecydowanie szybszy, o prawie 100%
Ale musiałem zwiększyć liczbę pętli do 100 milionów, zanim różnica była kwestią sekund, czyli w większości przypadków zacząłem dbać o wydajność.
Dlatego pozostanę przy użyciu tej
intval
funkcji, ponieważ casting to trochę magii języka, która się dzieje. Nawet jeśliintval
używa rzutowania za kulisami, jeśli miałby zostać wykryty błąd podczas rzutowania i z jakiegoś powodu nie można go naprawić (kompatybilność wsteczna?), To mogliby przynajmniej naprawić,intval
aby wykonać swój obowiązek.Aktualizacja (PHP 7.1 + dodatkowa skrzynka):
Wygląda 7.1 zoptymalizowany
intval
i „1” + 0 jest zwycięzcą tego konkursu prędkości :) ja nadal zachować stosującintval
w każdym razieźródło
+0
var ... nie jestem pewien, czy ukryta obsada jest szybsza niż jawna.+0
wygrywa ... to bardzo brudny hackv5.5.34
moje wyniki były9191.0059452057 ms
,23307.397127151 ms
i11483.719110489 ms
odpowiednio. Tak więc przed PHP 7 casting jest najszybszy.$a = '1' + 0;
i założę się, że większość nigdy nie myślała o zrobieniu tego w ten sposóbWydaje mi się, że istnieje co najmniej jedna różnica: za pomocą parametru intval można określić, która podstawa powinna być użyta jako drugi parametr (domyślnie podstawa 10):
dostanie cię:
źródło
intval("2g", 17) = 50 = 2*17 + 16
36
, takie jak wintval("g", 36) //16
. Każda wartość większa niż 36 zwraca 0. To sugeruje, że możemy użyć wszystkich znaków 0-9 plus az dla naszej niestandardowej bazy, npintval("z",36) //35
. Należy również zauważyć, że w pierwszym parametrze nie jest rozróżniana wielkość liter .Jedną użyteczną właściwością
intval
jest to, że - ponieważ jest to funkcja, a nie konstrukcja języka - może być przekazana jako argument funkcji, która oczekuje funkcji. Nie możesz tego zrobić(int)
.Na przykład użyłem go do oczyszczenia liczb całkowitych w celu włączenia do
IN()
klauzuli SQL , przekazując ją doarray_map
. Oto przykład:źródło
array_map(function($n){return (int)$n;}, $_POST['array_of_integers'])
Bursztyn ma rację i jeśli mogę dodać przydatne rzutowanie typu informacji (dodanie „(int)” przed wyrażeniem) jest od 300 do 600% szybsze niż intval. Więc jeśli twoim celem nie jest zajmowanie się innymi bazami niż dziesiętne, polecam użycie:
(int) $something
źródło
Rzeczą, która
intval
powoduje, że zwykły rzut nie jest, jest konwersja bazy:Jeśli baza ma 10, to
intval
powinna być taka sama jak obsada (chyba że będziesz podejrzany i wspominasz, że jedno wywołuje funkcję, a drugie nie). Jak wspomniano na stronie podręcznika :źródło