Réponses:
intval()
peut être passé une base à partir de laquelle convertir. (int)
ne peux pas.
int intval( mixed $var [, int $base = 10 ] )
$i++
est incorrect en rouge. Mais ça devrait être plus lent !!
$i++
. Que voulez-vous dire? Quand vous dites "Mais ça devrait être plus lent !!" que comparez-vous?
(int)
est plus rapide x 2! (int)
: Ideone.com/QggNGc , intval()
: ideone.com/6Y8mPN
Une chose à noter sur la différence entre (int)
et intval()
: intval()
traite les variables qui sont déjà int
s et float
s comme ne nécessitant aucune conversion, quel que soit l'argument de base (à partir de PHP 5.3.5 au moins). Ce comportement n'est pas le plus évident, comme indiqué dans les commentaires sur la page de documentation PHP et répété sans vergogne ici:
$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.
ensuite à nouveau la page a été apparemment mis à jour il y a quatre jours, alors peut - être que ce qui a été ajouté.
intval(12,8)
donnerait une réponse qui, une fois convertie en chaîne sans formatage, ressemblerait à une base 8 le numéro est tout simplement faux. Qu'attendriez-vous de intval(12,16)
parce qu'il ne peut pas faire un int a c
?
Désolé pour le necroing, je voulais juste voir si / comment PHP7 a un effet sur cette question:
$ php -v
PHP 7.0.4-5+deb.sury.org~trusty+1 (cli) ( NTS )
Le 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"
Comme vous pouvez le voir, le casting est nettement plus rapide, de près de 100%
Mais j'ai dû augmenter le nombre de boucles à 100 millions avant que la différence ne soit une question de secondes, c'est-à-dire quand je commencerais à me soucier des performances, dans la plupart des cas.
Je vais donc continuer à utiliser la intval
fonction, car le casting est un peu la magie du langage qui se produit. Même si le intval
casting est utilisé dans les coulisses, s'il devait y avoir un bug trouvé avec le casting, et pour une raison quelconque, il ne pouvait pas être corrigé (compatibilité descendante?), Alors ils pourraient au moins le corriger intval
pour accomplir son devoir.
Mise à jour (PHP 7.1 + cas supplémentaire):
$ 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"
On dirait que 7.1 optimisé intval
, et '1' + 0 est maintenant le gagnant de ce concours de vitesse :) Je continuerais à utiliser intval
quand même
+0
la var ... je ne sais pas si la conversion implicite ici est plus rapide que la conversion explicite.
+0
gagnant ... c'est un hack très sale
v5.5.34
mes résultats ont été 9191.0059452057 ms
, 23307.397127151 ms
et 11483.719110489 ms
respectivement. Donc, avant PHP 7, le casting est le plus rapide.
$a = '1' + 0;
et je parie que la plupart n'ont jamais pensé à le faire comme ça
Je pense qu'il y a au moins une différence: avec intval , vous pouvez spécifier quelle base doit être utilisée comme deuxième paramètre (base 10 par défaut):
var_dump((int)"0123", intval("0123"), intval("0123", 8));
vous obtiendrez:
int 123
int 123
int 83
intval("2g", 17) = 50 = 2*17 + 16
36
, comme dans intval("g", 36) //16
. Toute valeur supérieure à 36 renvoie 0. Cela suggère que nous pouvons utiliser tous les caractères 0-9 plus az pour notre base personnalisée, tels que intval("z",36) //35
. Il convient également de noter que le premier paramètre est insensible à la casse .
Une propriété utile de intval
est que - puisqu'il s'agit d'une fonction et non d'une construction de langage - il peut être passé comme argument à une fonction qui attend une fonction. Vous ne pouvez pas faire ça avec (int)
.
Par exemple, je l'ai utilisé pour filtrer les entiers à inclure dans une IN()
clause SQL en la passant à array_map
. Voici un exemple:
$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 a raison et si je peux ajouter un casting de type d'information utile (ajouter un "(int)" avant votre expression) est 300 à 600% plus rapide qu'intval. Donc, si votre but n'est pas de traiter avec d'autres bases que décimales, je recommande d'utiliser:
(int) $something
Ce qui intval
ne fait pas une conversion simple, c'est la conversion de base:
int intval ( mixed $var [, int $base = 10 ] )
Si la base est 10 cependant, cela intval
devrait être la même chose qu'un casting (sauf si vous allez être un peu nerveux et mentionner que l'un fait un appel de fonction tandis que l'autre ne le fait pas). Comme indiqué sur la page de manuel :
Les règles communes de la conversion d'entiers s'appliquent.