Existe alguma diferença em particular entre intval e (int)?
Exemplo:
$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];
Existe alguma diferença específica entre as duas linhas de código acima?
intval()
pode ser passada uma base a partir da qual converter. (int)
não podes.
int intval( mixed $var [, int $base = 10 ] )
$i++
estão incorretos em vermelho. Mas deve ser mais lento !!$i++
. O que você quer dizer? Quando você diz "Mas deve ser mais lento !!" o que você compara?(int)
typecast é mais rápido x 2!(int)
: Ideone.com/QggNGc ,intval()
: ideone.com/6Y8mPNUma coisa a ser observada sobre a diferença entre
(int)
eintval()
:intval()
trata as variáveis que já sãoint
es efloat
não precisam de conversão, independentemente do argumento base (pelo menos no PHP 5.3.5). Esse comportamento não é o mais óbvio, conforme observado nos comentários na página de documentos PHP e reiteradamente descaradamente reiterado aqui:fonte
The base parameter has no effect unless the var parameter is a string.
Então, novamente a página foi aparentemente atualizados há quatro dias, então talvez isso é o que foi adicionado.intval(12,8)
daria uma resposta que, quando convertida em uma string sem formatação, pareceria uma base 8 número está errado. O que você esperaria,intval(12,16)
porque não pode fazer um int ac
?Desculpe por necroing, eu só queria ver se / como o PHP7 afeta esta questão:
O teste:
Como você pode ver, a transmissão é definitivamente mais rápida, em quase 100%
Mas tive que aumentar a contagem de loop para 100 milhões antes que a diferença fosse uma questão de segundos, que é quando eu realmente começaria a me preocupar com o desempenho, na maioria dos casos.
Então, continuarei usando a
intval
função, porque a transmissão é um pouco de mágica da linguagem que está acontecendo. Mesmo queintval
use vazamento nos bastidores, se houvesse um erro encontrado no vazamento e, por algum motivo, ele não pudesse ser corrigido (compatibilidade com versões anteriores?), Eles poderiam pelo menos consertarintval
para executar seu dever.Atualização (caso PHP 7.1 + Extra):
Parece 7.1 otimizado
intval
, e '1' + 0 agora é o vencedor deste concurso de velocidade :) Eu continuaria usandointval
mesmo assimfonte
+0
a var ... não tenho certeza se o elenco implícito aqui é mais rápido que o explícito.+0
ganhar ... isso é um truque muito sujov5.5.34
os meus resultados foram9191.0059452057 ms
,23307.397127151 ms
e11483.719110489 ms
respectivamente. Portanto, antes do PHP 7, a transmissão é a mais rápida.$a = '1' + 0;
e aposto que a maioria nunca pensou em fazê-lo dessa maneiraEu acho que há pelo menos uma diferença: com intval , você pode especificar qual base deve ser usada como um segundo parâmetro (base 10 por padrão):
você receberá:
fonte
intval("2g", 17) = 50 = 2*17 + 16
36
, como emintval("g", 36) //16
. Qualquer valor maior que 36 retorna 0. Isso sugere que podemos usar todos os caracteres 0-9 mais az para nossa base personalizada, comointval("z",36) //35
. Além disso, deve-se notar que o primeiro parâmetro não diferencia maiúsculas de minúsculas .Uma propriedade útil de
intval
é que - como é uma função e não uma construção de linguagem - pode ser passada como argumento para uma função que espera uma função. Você não pode fazer isso com(int)
.Por exemplo, eu o usei para higienizar números inteiros para inclusão em uma
IN()
cláusula SQL passando-a paraarray_map
. Aqui está um exemplo:fonte
array_map(function($n){return (int)$n;}, $_POST['array_of_integers'])
Âmbar está certo e, se eu puder adicionar uma conversão de tipo de informação útil (adicionar um "(int)" antes da sua expressão) é 300 a 600% mais rápida que intval. Portanto, se seu objetivo não é lidar com outras bases que não sejam decimais, recomendo usar:
(int) $something
fonte
O
intval
que uma simples conversão não faz é a conversão básica:Se a base for 10, no entanto,
intval
deve ser a mesma que o elenco (a menos que você seja exigente e mencione que um faz uma chamada de função enquanto o outro não). Conforme observado na página do manual :fonte