对于以下代码片段,答案是 15。
$a = '5 USD';
$b = 10;
echo $a + $b;
但在变量$a
中,if5
介于两者之间'USD'
或之后'USD'
的输出是10
。为什么会这样?
来自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.
?>
“字符串到数字的转换”文档中没有提到它。
请参阅PHP 手册 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'; // The string starts with number, so by an implicit cast to int, it will be 5
$b = 10;
echo $a + $b; // = 15
在你写的另一个例子中
$a = 'USD 5'; // The string does not start with a number, so by an implicit cast to int, it will be 0
$b = 10;
echo $a + $b; // = 10
有关此转换的更多信息,请参阅strtod(3) 的 Unix 手册页。
因为
php > echo (int)"a";
0
因此,如果您将 PHP 可执行文件与
php > "USD 5" + "10"
它将两个操作数转换为整数:
php > (int)"USD 5" + (int)"10"
因此,您将收到0 + 10
.