PHP: (int) vs (intval)

erotic

Чем в PHP отличается приведение к типу int от вызова функции intval?
( т.е. (int)$a и intval($a) )

Fragaria

ничем вроде

erotic

Думаю, раз функцию зачем-то сделали, то разница быть должна.

Fragaria

функция осталась с тех времён, когда прямого typecasting ещё не было

dimabel

Ты прав, вызов функции незначительно медленнее получается.
<?php
function tm{
list($usec, $sec) = explode(" ", microtime;
return float)$usec + (float)$sec);
}
for($i=0;$i<65536;$i++){
$str[]='3625';
}
function test1{
global $str;
$start = tm;
for($i=0;$i<65536;$i++){
$g[]=(int)$str[$i];
}
$end = tm;
return $end-$start;
}
function test2{
global $str;
$start = tm;
for($i=0;$i<65536;$i++){
$g[]=intval($str[$i]);
}
$end = tm;
return $end-$start;
}
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache");
header("Cache-Control: post-check=0, pre-check=0");
header("Pragma: no-cache");
$a=$b=0;
print('<table border=1 bordercolor=black><tr><th>(int)<th>intval</tr>');
for($i=0;$i<8;$i++){
$a+=$_1=test1;$b+=$_2=test2;
printf('<tr><td>%.8f<td>%.8f</tr>',$_1,$_2);
}
printf('<tr><td colspan=2 align=center>Average:</tr><tr><td>%.8f<td>%.8f</tr></table>',$a/8,$b/8);
?>




































(int)intval
0.151083230.16385388
0.153334140.16355705
0.140885110.16150498
0.144763950.17138195
0.157844070.17810607
0.151258950.16187096
0.147095920.16384697
0.141618970.16743803
Average:
0.148485540.16644499


ЗЫ: результат заметно не меняется при изменении порядка вызова функций test1 и test2, а также - при многократных повторах тестов.

erotic

А в плане выполняемых преобразований - они абсолютно идентичны?

dimabel

О, Господи.
Преобразование в целое
Для несомненного преобразования значения в целое используйте приведение типа (int) или (integer). Однако в большинстве случаев вам нет необходимости использовать приведение типа, поскольку значение будет автоматически преобразовано, если оператор, функция или управляющая конструкция требует целый аргумент. Вы также можете преобразовать значение в целое при помощи функции intval.
intval -- Get integer value of a variable
[u]Description[/u]
int intval ( mixed var [, int base])
Returns the integer value of var, using the specified base for the conversion (the default is base 10).
var may be any scalar type. You cannot use intval on arrays or objects.
Замечание: The base argument for intval has no effect unless the var argument is a string.
Взято из php_manual_ru.chm
Еще есть функция settype, но её стоит использовать только если совсем приспичит: работать она будет, имхо, медленнее чем intval.

erotic

Спасибо
Оставить комментарий
Имя или ник:
Комментарий: