Nab*_*.Z. 3 php comparison if-statement operators
提供此链接.
我知道操作数与字符串类型转换为数字,然后通常的数学
但请参阅以下示例代码:
echo intval(1e1); // 10
var_dump("1e1" == 10); // true, and it's ok
echo intval(0x1A); // 26
var_dump("0x1A" == 26); // true, and it's ok
echo intval(042); // 34
var_dump("042" == 34); // fasle, Why ?!!!
Run Code Online (Sandbox Code Playgroud)
为什么上一个代码返回false.
那是因为PHP中的字符串到数字转换是基于一些古老的C函数 - strtod.其规则如下:
(字符串的初始部分)的预期形式是可选的前导空格,由isspace(3)识别,可选加号('+')或减号(' - '),然后是(i)十进制数字,或(ii)十六进制数[...]
十进制数由非空的十进制数字序列组成,可能包含基数字符(小数点,依赖于语言环境,通常为'.'),可选地后跟十进制指数.十进制指数由'E'或'e'组成,后跟可选的加号或减号,后跟非空的十进制数字序列,并表示乘以10的幂.[...]
十六进制数由"0x"或"0X"组成,后跟非空的十六进制数字序列,可能包含基数字符,可选地后跟二进制指数.[...]
如您所见,'1e1'字符串具有非空序列'1',后跟十进制指数'e1'.因此,它将被转换为十进制数 - 并变为10.
'0x1A'字符串遵循十六进制数的规则,并将相应地转换为26.但由于没有十八进制数的具体规则,'042'将被转换为纯十进制 - 并且变为42.当然,这不等于34.
这不应该与PHP本身如何解析数字文字相混淆.以0开头的数字文字被认为代表十八进制.所以,intval(042)基本上是相同的intval(34)- 但不一样intval("042").