¿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 sonints yfloats 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
intvalfunción, porque el casting es un poco de magia de lenguaje que está sucediendo. Incluso siintvalusa 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 solucionarlointvalpara 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 deintvaltodos modosfuente
+0el var ... no estoy seguro si el lanzamiento implícito aquí es más rápido que el explícito.+0ganador ... ese es un truco muy suciov5.5.34mis resultados fueron9191.0059452057 ms,23307.397127151 msy11483.719110489 msrespectivamente. 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 + 1636, 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
intvales 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) $somethingfuente
Lo que
intvalhace que un elenco simple no lo haga es la conversión de base:Sin embargo, si la base es 10,
intvaldeberí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