¿Hay alguna diferencia particular entre intval y (int)?
Ejemplo:
$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];
¿Hay alguna diferencia particular entre las dos líneas de código anteriores?
intval()
Se puede pasar una base desde la cual convertir. (int)
no puedo.
int intval( mixed $var [, int $base = 10 ] )
$i++
son incorrectos en rojo. ¡Pero debería ser más lento!$i++
. ¿Qué quieres decir? Cuando dices "¡Pero debería ser más lento!" que comparas(int)
conversión de texto es más rápida x 2!(int)
: Ideone.com/QggNGc ,intval()
: ideone.com/6Y8mPNUna cosa a tener en cuenta sobre la diferencia entre
(int)
yintval()
:intval()
trata las variables que ya sonint
s yfloat
s que no necesitan conversión, independientemente del argumento base (al menos a partir de PHP 5.3.5). Este comportamiento no es el más obvio, como se señala en los comentarios en la página de documentación de PHP y se lo reitera descaradamente aquí:fuente
The base parameter has no effect unless the var parameter is a string.
otra parte de la página se actualiza al parecer, hace cuatro días, así que quizás eso es lo que se añadió.intval(12,8)
daría una respuesta que cuando se convierte en una cadena sin formato se vería como una base 8 El número está mal. ¿Qué esperarías deintval(12,16)
porque no puede hacer una int ac
?Perdón por necroing, solo quería ver si PHP7 tiene un efecto sobre esta pregunta:
La prueba:
Como puede ver, el lanzamiento es definitivamente más rápido, en casi un 100%
Pero tuve que aumentar el conteo de bucles a 100 millones antes de que la diferencia fuera cuestión de segundos, que es aproximadamente cuando realmente comenzaría a preocuparme por el rendimiento, en la mayoría de los casos.
Así que me quedaré con el uso de la
intval
función, porque el casting es un poco de magia de lenguaje que está sucediendo. Incluso siintval
usa el casting detrás de escena, si se encontrara un error con el casting, y por alguna razón no se puede solucionar (¿compatibilidad hacia atrás?), Entonces al menos podrían solucionarlointval
para cumplir con su deber.Actualización (PHP 7.1 + caso adicional):
Parece 7.1 optimizado
intval
, y '1' + 0 ahora es el ganador de este concurso de velocidad :) Todavía seguiría usando deintval
todos modosfuente
+0
el var ... no estoy seguro si el lanzamiento implícito aquí es más rápido que el explícito.+0
ganador ... ese es un truco muy suciov5.5.34
mis resultados fueron9191.0059452057 ms
,23307.397127151 ms
y11483.719110489 ms
respectivamente. Entonces, antes de PHP 7, el casting es el más rápido.$a = '1' + 0;
y apuesto a que nunca pensé en hacerlo asíCreo que hay al menos una diferencia: con intval , puede especificar qué base debe usarse como segundo parámetro (base 10 por defecto):
te conseguirá:
fuente
intval("2g", 17) = 50 = 2*17 + 16
36
, como enintval("g", 36) //16
. Cualquier valor mayor que 36 devuelve 0. Eso sugiere que podemos usar todos los caracteres 0-9 más az para nuestra base personalizada, comointval("z",36) //35
. Además, debe tenerse en cuenta que el primer parámetro no distingue entre mayúsculas y minúsculas .Una propiedad útil de
intval
es que, dado que es una función y no una construcción de lenguaje, se puede pasar como argumento a una función que espera una función. No puedes hacer esto con(int)
.Por ejemplo, lo he usado para desinfectar enteros para su inclusión en una
IN()
cláusula SQL pasándolo aarray_map
. Aquí hay un ejemplo:fuente
array_map(function($n){return (int)$n;}, $_POST['array_of_integers'])
Amber tiene razón y si puedo agregar un tipo de información útil (agregar un "(int)" antes de su expresión) es 300 a 600% más rápido que intval. Entonces, si su propósito no es tratar con otras bases que no sean decimales, le recomiendo usar:
(int) $something
fuente
Lo que
intval
hace que un elenco simple no lo haga es la conversión de base:Sin embargo, si la base es 10,
intval
debería ser lo mismo que un elenco (a menos que seas quisquilloso y mencione que uno realiza una llamada a la función mientras que el otro no). Como se señala en la página del manual :fuente