'0xD'
是一个字符串。文档清楚地指定了如何将字符串“强制”为整数值(在此处选择示例):(int) '0xD';
在数值上下文中计算字符串时,将按如下方式确定结果值和类型。
如果字符串不包含任何字符“.”、“e”或“E”,并且数值符合整数类型限制(由 PHP_INT_MAX 定义),则该字符串将作为整数进行计算。在所有其他情况下,它将作为浮点数进行评估。
该值由字符串的初始部分给出。如果字符串以有效的数字数据开头,则这将是使用的值。否则,该值将为 0(零)。有效数值数据是可选符号,后跟一个或多个数字(可选包含小数点),后跟可选指数。指数是后跟一个或多个数字的“e”或“E”。
作为数字的弦的初始孔隙是 ,因此它是 。'0xD'
0
(int) 0
不要将此与编写代码混为一谈。如果你在代码中写它不是一个字符串,它是一个整数的十六进制表示/表示法(Demo):
<?php
$value = eval("return 0xD;");
var_dump($value); # int(13)
这并没有完全回答为什么表达式导致 ,而是解释了到目前为止的其他一切,以及整数值解释的两个规则适用于PHP。'0xD' * 1
(int) 13
我假设在 PHP 中转换为整数和整数上下文之间略有不同。如果字符串表示十六进制数,则在整数/浮点数上下文中使用它:
'0xD' * 1
在此表达式中,由于运算符和操作数,字符串将被计算为 number(请参见类型杂耍)。这不是类型转换,因为没有强制转换语言构造。'0xD'
*
1
看起来,在此表达式的情况下,字符串作为整数的解释是按字面意思(按指定)完成的,但与执行转换时不同。
有人可能会争辩说,当转换适用时,当字面解释适用时,它仍然没有记录在案。但是,使用类型转换可以解决任何此类问题(演示):
<?php
$value = '0xD';
var_dump($value); # string(3) "0xD"
var_dump($value * 1); # int(13)
var_dump((int) $value * 1); # int(0)