为什么“10”==“0xa”评估为true,但“10”==“012”不是?

时间:2015-05-06 18:40:59

标签: php

这些天我发现了这个奇怪的代码片段"10" == "0xa",其评估结果为true。我在文档中找到的最好的是关于Type Juggling

  

变量的类型由使用变量的上下文决定

但我没有在该代码片段中看到任何整数上下文。虽然询问周围的人似乎接受这个功能。我听到的一个解释是PHP会将它们作为数字进行比较。所以我对一些有效的10个表达式(使用PHP-5.6.5)做了一些数字比较:

<?php
var_dump(
    0b1010, "10" == "0b1010", // false
    012,    "10" == "012",    // false
    0xa,    "10" == "0xa",    // true
    1E+1,   "10" == "1E+1",   // true
    1e1,    "10" == "1e1",    // true
    10.0,   "10" == "10.0",   // true
    +10,    "10" == "+10"     // true
);

手册中记录了这种行为在哪里?

修改:请在示例代码的上下文中理解该问题。这应该强调二进制和八进制表示与其余表示之间的不一致。

1 个答案:

答案 0 :(得分:5)

PHP Docs reference

  

如果您将数字与字符串进行比较或比较涉及数字字符串,则会将每个字符串转换为数字,并以数字方式执行比较。

(我的重点)

修改

数字刺痛是从is_numeric()函数

返回布尔true的数字刺痛
  

查找给定变量是否为数字。数字字符串由可选符号,任意数量的数字,可选的小数部分和可选的指数部分组成。因此+ 0123.45e6是有效的数值。也允许十六进制(例如0xf4c3b00c),二进制(例如0b10100111001),八进制(例如0777)表示法,但仅允许没有符号,十进制和指数部分。