Answers:
intval()
可以传递转换的基础。(int)
不能。
int intval( mixed $var [, int $base = 10 ] )
$i++
是不正确的红色。但是应该慢一些!
$i++
。你什么意思?当您说“但是应该慢一些!” 你比较什么?
有一点需要注意的区别(int)
和intval()
:intval()
对待变量,已经是int
S和float
S作为需要任何转换,无论基本参数的(如PHP 5.3.5至少)。正如在PHP doc页面上的注释中所指出的那样,这种行为并不是最明显的,并且在这里毫不客气地重申:
$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.
然后该页面显然是在四天前更新的,所以也许这就是添加的内容。
intval(12,8)
的答案是,当转换为无格式的字符串时,它看起来像以8为底数字是错误的。您会intval(12,16)
因为无法进行int操作而期望得到什么c
?
对不起,我只是想看看PHP7是否/对这个问题有影响:
$ php -v
PHP 7.0.4-5+deb.sury.org~trusty+1 (cli) ( NTS )
考试:
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"
如您所见,投放速度肯定快了近 100%
但是我必须将循环数增加到1亿,然后差异只有几秒钟,这就是在大多数情况下我实际上开始关心性能的时间。
所以我会坚持使用该intval
函数,因为强制转换是一种正在发生的语言魔术。即使在intval
后台使用了强制转换,如果在强制转换中发现了一个错误,并且由于某种原因无法修复(向后兼容吗?),那么它们至少也可以修复。intval
以执行此任务。
更新(PHP 7.1 +特例):
$ 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"
像7.1的外观优化intval
,和“1” + 0现在这个速度竞赛的优胜者:)我还是会继续使用intval
反正
+0
var ...不确定此处的隐式强制转换是否比显式的转换更快。
+0
获胜...这是一个非常肮脏的hack
v5.5.34
我的研究结果9191.0059452057 ms
,23307.397127151 ms
和11483.719110489 ms
分别。因此,在PHP 7之前,铸造是最快的。
$a = '1' + 0;
,我敢打赌大多数从来没有想过做这样的
我认为至少有一个区别:使用intval,您可以指定哪个基数应用作第二个参数(默认情况下,基数为10):
var_dump((int)"0123", intval("0123"), intval("0123", 8));
会给你:
int 123
int 123
int 83
intval("2g", 17) = 50 = 2*17 + 16
36
,例如in intval("g", 36) //16
。任何大于36的值都将返回0。这表明我们可以将所有0-9加az字符用于自定义基数,例如intval("z",36) //35
。另外,应注意的是,第一个参数不区分大小写。
的一个有用特性intval
是-因为它是一个函数而不是语言构造,所以它可以作为参数传递给需要该函数的函数。你不能这样做(int)
。
例如,我使用它通过将整数IN()
传递给来清理整数以包含在SQL 子句中array_map
。这是一个例子:
$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'])
琥珀是正确的,如果我可以添加有用的信息类型转换(在表达式之前添加“(int)”)比intval快300到600%。因此,如果您的目的不是处理除十进制以外的其他基数,我建议使用:
(int) $something