在php中投射的原因是什么?

时间:2011-03-18 18:24:52

标签: php string casting

我在一些帖子上看过这个:

$num = "5";
if(((int)$num) < 4){ ...}

是否有理由将“5”作为一个int或者说它是好的:

if($num < 4){ ...}

因为我用我的代码测试了它:

echo $num + 4; //outputs 9
echo (int)$num + 4;//also outputs 9

更新 我的问题是关于一般的投射,上面只是一两个例子。

更新2:关闭type juggling manual php

<?php
$foo = "0";  // $foo is string (ASCII 48)
$foo += 2;   // $foo is now an integer (2)
$foo = $foo + 1.3;  // $foo is now a float (3.3)
$foo = 5 + "10 Little Piggies"; // $foo is integer (15)
$foo = 5 + "10 Small Pigs";     // $foo is integer (15)
?>

^^^^为什么最后两件事发生了?

3 个答案:

答案 0 :(得分:7)

在你提到的案例中,没有真正的充分理由。这是因为,PHP不仅是一种动态类型语言,所使用的运算符也不是类型敏感的。

然而,铸造也有很多好的用途。在(int)的情况下,您可以强制转换以确保在操作期间始终使用整数。此外,通过提前投射,您可以节省PHP,以便以后继续输入juggle。

由于问题编辑而修改(rev4)

最后两个项目发生是因为PHP会在数学运算期间尝试将字符串强制转换为整数。因此,它将字符串解析为数字。一旦找不到有效的整数,就会返回找到的数字。

基本上,从字符串的开头,找到与integer/float numbering format匹配的任何内容。只要STOPS匹配该格式,就返回您拥有的内容。如果第一个字符与格式return 0;无法匹配。

如需更好的解释,请阅读:http://www.php.net/manual/en/language.types.integer.php#language.types.integer.casting

答案 1 :(得分:2)

我在这里读到的一切听起来都很合理,所以我不会重复它。相反,我将给出两个我在PHP中经常使用类型转换的例子:

  1. 提供API并尝试以各种格式返回正确的类型通常需要显式键入每个返回值。例如,如果我通过XML_Serializer或XML-RPC返回一些混合数据,并且我没有正确地转换我的整数/浮点数,它们将作为字符串返回,这会导致使用强类型语言尝试的所有问题使用API​​。但是,我不能谈论SOAP + WSDL如何处理它,因为我没有搞砸它。

  2. 在库(或我们的代码)返回数组或null并且我们不能/不想修改它的情况下,将返回值转换为数组。这通常只是为了防止在将非数组传递给数组控件结构或方法时得到的警告。

答案 2 :(得分:1)

执行算术运算时不需要强制转换,因为PHP会隐式执行。我从来没有遇到默认隐式演员不是我想要的情况。实际上,在PHP中,强制转换很少有用。

当我知道变量将在很多数学运算中使用时,我经常将一个字符串显式地转换为赋值的整数(或浮点数)。

这是一个有用的读物​​: