Risposte:
intval()può essere passata una base da cui convertire. (int)non può.
int intval( mixed $var [, int $base = 10 ] )
$i++ è corretta in rosso. Ma dovrebbe essere più lento !!
$i++. Cosa intendi? Quando dici "Ma dovrebbe essere più lento !!" cosa confronti?
(int)typecast è più veloce x 2! (int): Ideone.com/QggNGc , intval(): ideone.com/6Y8mPN
Una cosa da notare sulla differenza tra (int)e intval(): intval()considera le variabili che sono già ints e floats come non necessitano di conversione, indipendentemente dall'argomento di base (almeno da PHP 5.3.5). Questo comportamento non è il più ovvio, come notato nei commenti sulla pagina del documento PHP e reiteratamente spudorato qui:
$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.Poi di nuovo la pagina è stata apparentemente aggiornato quattro giorni fa, quindi forse questo è ciò che è stato aggiunto.
intval(12,8)darebbe una risposta che quando convertito in una stringa senza formattazione sembrerebbe una base 8 il numero è semplicemente sbagliato. Cosa ti aspetteresti da intval(12,16)perché non può fare un int a c?
Ci scusiamo per il necroing, volevo solo vedere se / come PHP7 ha un effetto su questa domanda:
$ php -v
PHP 7.0.4-5+deb.sury.org~trusty+1 (cli) ( NTS )
Il test:
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"
Come puoi vedere, il casting è decisamente più veloce, di quasi il 100%
Ma ho dovuto aumentare il conteggio dei loop a 100 milioni prima che la differenza fosse una questione di secondi, ovvero quando avrei iniziato a preoccuparmi delle prestazioni, nella maggior parte dei casi.
Quindi continuerò con l'uso della intvalfunzione, perché il casting è un po 'di magia del linguaggio che sta accadendo. Anche se intvalusa il casting dietro le quinte, se dovesse esserci un bug trovato con il casting, e per qualche motivo non potesse essere corretto (retrocompatibilità?), Avrebbero potuto almeno risolvere intvalil proprio dovere.
Aggiornamento (PHP 7.1 + Caso aggiuntivo):
$ 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"
Assomiglia 7.1 ottimizzati intval, e '1' + 0 è ora il vincitore di questa gara di velocità :) mi piacerebbe ancora continuo ad usare intvalin ogni caso
+0il var ... non sono sicuro che il cast implicito qui sia più veloce di quello esplicito.
+0vincente ... è un trucco molto sporco
v5.5.34i miei risultati sono stati 9191.0059452057 ms, 23307.397127151 mse 11483.719110489 ms, rispettivamente. Quindi, prima di PHP 7, il casting è il più veloce.
$a = '1' + 0;e scommetto che la maggior parte non ha mai pensato di farlo in quel modo
Penso che ci sia almeno una differenza: con intval , puoi specificare quale base dovrebbe essere usata come secondo parametro (base 10 di default):
var_dump((int)"0123", intval("0123"), intval("0123", 8));
ti porterà:
int 123
int 123
int 83
intval("2g", 17) = 50 = 2*17 + 16
36, come in intval("g", 36) //16. Qualsiasi valore superiore a 36 restituisce 0. Ciò suggerisce che possiamo usare tutti i caratteri 0-9 più az per la nostra base personalizzata, ad esempio intval("z",36) //35. Inoltre, va notato che il primo parametro non fa distinzione tra maiuscole e minuscole .
Una proprietà utile di intvalè che, poiché è una funzione e non un costrutto di linguaggio, può essere passata come argomento a una funzione che prevede una funzione. Non puoi farlo con (int).
Ad esempio, l'ho usato per disinfettare numeri interi per l'inclusione in una IN()clausola SQL passandola a array_map. Ecco un esempio:
$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'])
Amber ha ragione e se posso aggiungere un tipo di informazione utile il casting (aggiungendo un "(int)" prima della tua espressione) è dal 300 al 600% più veloce di intval. Quindi, se il tuo scopo non è quello di trattare con basi diverse dai decimali, ti consiglio di usare:
(int) $something
La cosa che intvalfa un cast semplice non è la conversione di base:
int intval ( mixed $var [, int $base = 10 ] )
Se la base è 10, intvaldovrebbe essere la stessa di un cast (a meno che tu non sia pignolo e menziona che uno fa una chiamata di funzione mentre l'altro no). Come notato nella pagina man :
Si applicano le regole comuni per il casting di numeri interi.