tutorial sirve que programacion para lenguaje descargar caracteristicas php

php - sirve - ¿Hay alguna diferencia particular entre intval y casting en int-`(int) X`?



php tutorial (7)

Amber está en lo cierto y si puedo agregar un tipo de información útil de fundición (agregando 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, recomiendo usar: (int) $something

¿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?


Creo que hay al menos una diferencia: con intval , puede especificar qué base se debe usar como un segundo parámetro (base 10 de manera predeterminada):

var_dump((int)"0123", intval("0123"), intval("0123", 8));

lo conseguirá:

int 123 int 123 int 83


Lo que intval hace que un simple elenco no es la conversión base:

int intval ( mixed $var [, int $base = 10 ] )

Sin embargo, si la base es 10, intval debe ser igual a un molde (a menos que seas quisquilloso y menciones que uno hace una llamada de función mientras que el otro no). Como se indica en la intval :

Se aplican las reglas comunes de conversión de enteros.


Lo siento por necroing, solo quería ver si / cómo PHP7 tiene un efecto en esta pregunta:

$ php -v PHP 7.0.4-5+deb.sury.org~trusty+1 (cli) ( NTS )

La prueba:

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"

Como pueden ver, el casting es definitivamente más rápido, casi un 100%

Pero tuve que aumentar el recuento de ciclos a 100 millones antes de que la diferencia fuera una cuestión de segundos, que es cuando realmente comenzaba a preocuparme por el rendimiento, en la mayoría de los casos.

Así que me quedaré con el uso de la función intval , porque el casting es un poco de magia del lenguaje que está sucediendo. Incluso si intval usa el casting detrás de las escenas, si hubiera un error encontrado con el casting, y por alguna razón no podría ser reparado (¿compatibilidad con versiones anteriores?), Al menos podrían arreglar intval para cumplir con su deber.

Actualización (caso de PHP 7.1 + Extra):

$ 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"

Parece que 7.1 intval optimizado, y ''1'' + 0 es ahora el ganador de este concurso de velocidad :) De todos modos intval usando intval todos modos


Una cosa a tener en cuenta acerca de la diferencia entre (int) e intval() : intval() trata las variables que ya son int s y float s que no necesitan conversión, independientemente del argumento base (al menos 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 doc de PHP y se reiteró descaradamente aquí:

$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?


Una propiedad útil de intval es que, dado que es una función y no una construcción de lenguaje, se puede pasar como un 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 cláusula SQL IN() pasándolo a array_map . Aquí hay un ejemplo:

$ids = implode(",", array_map(''intval'', $_POST[''array_of_integers''])); $sql = "SELECT * FROM table WHERE ids IN ($ids)";


intval() puede pasar una base desde la cual convertir. (int) no puede.

int intval( mixed $var [, int $base = 10 ] )