将字符串强制转换为整型


casting string to int

我的代码

<?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并没有看到十六进制值在字符串中作为可能的整数