Y a-t-il une différence particulière entre intval et (int)?
Exemple:
$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];
Y a-t-il une différence particulière entre les deux lignes de code ci-dessus?
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/6Y8mPNUne chose à noter sur la différence entre
(int)
etintval()
:intval()
traite les variables qui sont déjàint
s etfloat
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:la source
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 deintval(12,16)
parce qu'il ne peut pas faire un int ac
?Désolé pour le necroing, je voulais juste voir si / comment PHP7 a un effet sur cette question:
Le test:
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 leintval
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 corrigerintval
pour accomplir son devoir.Mise à jour (PHP 7.1 + cas supplémentaire):
On dirait que 7.1 optimisé
intval
, et '1' + 0 est maintenant le gagnant de ce concours de vitesse :) Je continuerais à utiliserintval
quand mêmela source
+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 salev5.5.34
mes résultats ont été9191.0059452057 ms
,23307.397127151 ms
et11483.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 çaJe 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):
vous obtiendrez:
la source
intval("2g", 17) = 50 = 2*17 + 16
36
, comme dansintval("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 queintval("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:la source
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
la source
Ce qui
intval
ne fait pas une conversion simple, c'est la conversion de base: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 :la source