Ria*_*iaD 16 php type-conversion
我的代码
<?php
var_dump('0xD' * 1 );
var_dump((int)'0xD');
var_dump(intval('0xD'));
var_dump((float)'0xD');
Run Code Online (Sandbox Code Playgroud)
实际结果:
int(13)
int(0)
int(0)
float(0)
Run Code Online (Sandbox Code Playgroud)
为什么前两个条件的结果不一样?你能给我正确的文件吗?
我找到的只是
所以,据我所知,文档说直接转换为int并通过放入数字上下文应该是相同的.我的错是什么?
增加:在回答之前尝试检查第一个和第二个代码(和输出).
hak*_*kre 10
'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)
Run Code Online (Sandbox Code Playgroud)
这并不能完全回答表达式'0xD' * 1导致的原因(int) 13,但到目前为止解释了其他所有内容以及整数值解释的两个规则在PHP中的应用.
我假设在PHP中转换为整数和整数上下文之间存在细微差别.如果字符串表示十六进制数,则在整数/浮点上下文中使用:
'0xD' * 1
Run Code Online (Sandbox Code Playgroud)
在此表达式中,'0xD'由于*运算符和1操作数,字符串将被计算为数字(请参阅类型杂项).这不是类型转换,因为没有转换语言构造.
看起来在这个表达式的情况下,字符串作为整数的解释是按字面意思(如指定的那样)完成的,但与进行转换时不同.
有人可能会说,在适用转换时以及适用字面解释时,它仍然没有记录.但是,使用类型转换可以解决任何此类问题(演示):
<?php
$value = '0xD';
var_dump($value); # string(3) "0xD"
var_dump($value * 1); # int(13)
var_dump((int) $value * 1); # int(0)
Run Code Online (Sandbox Code Playgroud)