我的代码
<?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)
为什么前两个条件的结果不一样?你能给我正确的文件吗?
我找到的只是
所以,据我所知,docs说直接转换为int并通过放入数字上下文应该是相同的。我的错是什么?
ADDED :在回答之前尝试检查第一个和第二个代码(和输出)。
答案 0 :(得分:9)
'0xD'
是一个字符串。 documentation clearly specifies如何将字符串“转换”为整数值(在此处选择(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'
运算符和*
操作数(请参阅Type Juggling),字符串1
将被计算为数字。这不是类型转换,因为没有强制转换语言构造。
在这个表达式的情况下,将字符串解释为整数is done literally(如指定的那样),但与转换时不同。
有人可能会认为,在适用转换时以及适用字面解释时,它仍然没有记录。但是,使用类型转换可以解决任何此类问题(Demo):
<?php
$value = '0xD';
var_dump($value); # string(3) "0xD"
var_dump($value * 1); # int(13)
var_dump((int) $value * 1); # int(0)
答案 1 :(得分:2)
这是引用,显然。
<?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没有看到字符串中的十六进制值作为可能的整数。