来自php.net:
当在数字上下文中计算字符串时,结果值
和类型确定如下。
如果字符串不包含任何字符“.”、“e”或“E”
并且数值适合整数类型限制(定义为
PHP_INT_MAX),字符串将被评估为整数。在所有其他
情况下,它将被评估为浮点数。
该值由字符串的初始部分给出。如果字符串
以有效的数字数据开头,这将是使用的值。
否则,该值将为 0(零)。有效的数字数据是
可选符号,后跟一个或多个数字(可选包含一个
小数点),后跟一个可选的指数。指数是一个
'e' 或 'E' 后跟一个或多个数字。
字面意思:
-
$a + $b 表示numeric + numeric。
-
"5 USD" 以有效的数字数据开头,因此 PHP 将其转换为 5。
-
"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.
?>
“字符串到数字的转换”文档中没有提到。