当前位置:  开发笔记 > 编程语言 > 正文

intval和int之间是否有任何特别的区别 - "(int)X`?

如何解决《intval和int之间是否有任何特别的区别-"(int)X`?》经验,为你挑选了7个好方法。

intval和(int)之间有什么特别的区别吗?

例:

$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];

上面两行代码之间有什么特别的区别吗?



1> Amber..:

intval()可以通过转换的基数.(int)不能.

int intval( mixed $var  [, int $base = 10  ] )


根据http://wiki.phpbb.com/Best_Practices:PHP,(int)比intval()更快
我对ideone进行了基准测试 - **`(int)`类型转换更快x 2!**`(int)`:http://ideone.com/QggNGc,`intval()`:http://ideone.com/6Y8mPN

2> t-dub..:

有一点需要注意的区别(int)intval():intval()把它们已经变量intS和floatS作为需要任何转换,无论基本参数的(如PHP 5.3.5至少).这种行为不是最明显的,正如PHP文档页面上的评论中所指出的那样,并且在这里无耻地重申:

$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?


doc _does_说`除非var参数是字符串,否则base参数无效.然后页面显然在四天前更新了,所以也许这就是添加的内容.
鉴于该功能在理论上可以进行碱基转换,因此该行为有点令人惊讶.它之前绝对让我失望,但也许我只需要更仔细地对RTFM :)
嗯,不.[这已有近11年的突出记录](https://bugs.php.net/bug.php?id=7878).
我意识到这是一个老线程,如果你还在编程,那么我希望你现在明白为什么这实际上是最明显的结果.int没有基数,因为base仅用于字符串表示.或者更简单地说,基数10中的12的int与基数99中的12的int相同.它仍然是12.期望`intval(12,8)`会给出一个答案,当转换为字符串时没有格式看起来像一个基数8号是错的.你对`intval(12,16)`有什么期望?因为它不能使int成为`c`?

3> Populus..:

对不起,我只是想知道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`获胜...这是一个非常肮脏的hack

4> Pascal MARTI..:

我认为至少有一个区别:使用intval,你可以指定哪个base应该用作第二个参数(默认为10):

var_dump((int)"0123", intval("0123"), intval("0123", 8));

会得到你:

int 123
int 123
int 83


我发现可以将基数17"g"转换为十进制非常有趣:`intval("2g",17)= 50 = 2*17 + 16`

5> 小智..:

Amber是正确的,如果我可以添加一个有用的信息类型转换(在表达式之前添加"(int)")比intval快300到600%.因此,如果您的目的不是处理小数以外的其他基数,我建议使用: (int) $something


你可能会觉得有趣的东西:http://programmers.stackexchange.com/questions/99445/is-micro-optimisation-important-when-coding

6> Kodos Johnso..:

一个有用的属性intval是 - 因为它是一个函数而不是语言构造 - 它可以作为参数传递给需要函数的函数.你不能这样做(int).

例如,我已经使用它来IN()通过传递它来清理整数以包含在SQL 子句中array_map.这是一个例子:

$ids = implode(",", array_map('intval', $_POST['array_of_integers']));
$sql = "SELECT * FROM table WHERE ids IN ($ids)";



7> deceze..:

intval做简单演员的事情不是基本转换:

int intval ( mixed $var [, int $base = 10 ] )

如果基数是10,则intval应该与演员相同(除非你是挑剔的并且提到一个人进行函数调用而另一个没有).如手册页所述:

整数投射的通用规则适用.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有