2013-05-31 58 views
2

对于下面的代码片断:为什么这里的答案是15?

$a = '5 USD'; 
$b = 10; 
echo $a + $b; 

答案是15.但是,在可变$a如果5是在'USD'之间或'USD'后的输出是10。为什么是这样?有人可以解释吗?

+10

这就是所谓的“宽松打字”和“类型杂耍”http://www.php.net/manual/en/language.types.type-juggling.php –

+0

你能多解释一下@Mark Ba​​rker –

+2

我链接的页面几乎包含了所有内容....您使用另一个(整数)值(10)的加法运算符,因此PHP会尝试通过将字符串转换为可以添加到10的整数值来添加 –

回答

13

php.net

当一个字符串在数值上下文中计算,将得到的值 和类型被确定如下。

如果字符串不包含任何字符“”,‘E’,或‘E’ 和数值装配到整数类型的限制(如通过 PHP_INT_MAX定义)时,字符串将被评估为一个整数。在所有其他 的情况下,它将被评估为浮动。

该值由字符串的起始部分给出。如果字符串 以有效数字数据开头,则这将是使用的值。 否则,该值将为0(零)。有效的数字数据是一个可选符号 ,后跟一个或多个数字(可选包含小数点 ),后跟可选的指数。指数是 'e'或'E'后跟一个或多个数字。

字面上:

  1. $a + $b装置numeric + numeric
  2. "5 USD"以有效的数字数据开头,所以PHP将其转换为5
  3. "USD 5""U5SD"开始与有效的数字数据,所以PHP将其转换为0

UPDv1:

<?php 
header('Content-Type: text/plain'); 

function plus($a, $b){ 
    echo $a, ' + ', $b, ' = ', $a + $b, PHP_EOL; 
} 

plus('5 frogs', 3); // 5 + 3 = 8 
plus('frogs: 5', 3); // 0 + 3 = 3 
plus('f5rogs', 3); // 0 (not HEX) + 3 = 3 
plus('0xF5', 3);  // 245 (HEX) + 3 = 248 
plus('0011b', 3);  // 11 (not BIN) + 3 = 14 
plus('1E5', '1.2xx'); // 100000 (FLOAT) + 1.2 (FLOAT) = 100001.2 
plus('true', 2);  // 0 (not BOOL) + 2 = 2 
?> 

而且,看看这个:php string number concatenation messed up


UPDv2:

有 “没有办法” 的PHP来强制转换字符串值八进制,无论零填充效果。仍然如前所述,PHP能够将字符串转换为十六进制。

<?php 
header('Content-Type: text/plain'); 

function plus($a, $b){ 
    echo $a, ' + ', $b, ' = ', $a + $b, PHP_EOL; 
} 

plus(008, 12);  // Invalid octal, PHP assumes it is 0. Result: 12. 
plus('008', 12); // Invalid octal? No, it is decimal. Result: 20. 
plus(0x0F, 1);  // Valid hexadecimal. Result: 16. 
plus('0x0F', 1); // Valid hexadecimal. Result: 16. 
plus('0x0X', 1); // Invalid hexadecimal, PHP assumes it is 0. Result: 1. 
?> 

它能在不提及“串数字转换”文档。

0

因为

php > echo (int)"a"; 
0 

所以,如果你给PHP与

php > "USD 5" + "10" 

则施放两个操作数为整数

php > (int)"USD 5" + (int)"10" 

,因此,您将收到的0 + 10

6
结果

参见PHP Manual Language.types.string.conversion

字符串转换为数字

当一个字符串被在数值上下文评价,所得到的值和类型被确定为如下。

如果字符串不包含'。','e'或'E'中的任何字符,并且数值适合整数类型限制(由PHP_INT_MAX定义),则字符串将被评估为整数。在所有其他情况下,它将被评估为浮动。

该值由字符串的起始部分给出。如果字符串以有效的数字数据开头,则这将是使用的值。否则,该值将为0(零)。有效的数字数据是一个可选符号,后跟一个或多个数字(可选包含一个小数点),后跟一个可选的指数。指数是一个'e'或'E',后跟一个或多个数字。

的例子可以在手动(以上链接)

$foo = 1 + "bob-1.3e3";   // $foo is integer (1) 
$foo = 1 + "bob3";    // $foo is integer (1) 
$foo = 1 + "10 Small Pigs";  // $foo is integer (11) 

找到回答你的问题

$a = '5 USD'; //string starts with number so implicit cast to int it will be 5 
$b = 10; 
echo $a + $b; // = 15 

在你写

$a = 'USD 5'; //string does not start with number so implicit cast to int it will be 0 
$b = 10; 
echo $a + $b; // = 10 

欲了解更多信息,其他的例子在这个转换中,se e Unix manual page for strtod(3).

相关问题