我的代码
<?php
var_dump('0xD' * 1 );
var_dump((int)'0xD');
var_dump(intval('0xD'));
var_dump((float)'0xD');
实际结果:int(13)
int(0)
int(0)
float(0)
为什么前两个条件的结果不一样?你能提供给我正确的文件吗?
所有我发现的是
- 类型转换:PHP中的类型转换与C中的类型转换非常相似:所需类型的名称写在要转换的变量之前的括号中。在特定类型之间进行强制转换时,可能不太清楚会发生什么。有关更多信息,请参阅以下部分:…
- 转换为整数:从字符串:参见字符串到数字的转换
- 字符串转换为数字当字符串在数值上下文中求值时,结果值和类型如下所示。
所以,据我所知,文档说直接转换为int和放在数字上下文中应该是一样的。我错在哪里?
ADDED:在回答之前尝试检查第一个和第二个代码(和输出)。
'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)
这并不能完全解释为什么表达式'0xD' * 1
会得到(int) 13
,但是解释了到目前为止的所有其他内容,以及在PHP中应用了哪两个整数值解释规则。
我假设在PHP中转换为整型和整型上下文之间有细微的区别。如果字符串表示十六进制数,则在整数/浮点上下文中使用:
'0xD' * 1
在这个表达式中,字符串'0xD'
将被计算为数字,因为*
操作符和1
操作数(参见类型杂耍)。这不是类型转换,因为没有强制转换语言结构。
看起来,在这个表达式的情况下,将字符串解释为整数是按字面意思(按指定)完成的,但与进行转换时不同。
有人可能会说,当应用转换和应用文字解释时,仍然没有文档记录。然而,使用类型转换可以解决任何这样的问题(Demo):
<?php
$value = '0xD';
var_dump($value); # string(3) "0xD"
var_dump($value * 1); # int(13)
var_dump((int) $value * 1); # int(0)
显然是引号。
<?php
var_dump('0xD' * 1 );
var_dump((int) 0xD);
var_dump(intval(0xD));
var_dump((float) 0xD);
为
int(13)
int(13)
int(13)
float(13)
我认为PHP并没有看到十六进制值在字符串中作为可能的整数