これは、PHPでの文字列から数値への変換が、いくつかの古いC関数に基づいているためです- strtod
。そして、そのルールは次のとおりです。
文字列(の最初の部分)の予想される形式は、isspace(3)で認識されるオプションの先頭の空白、オプションのプラス('+')またはマイナス記号('-')、および(i)10進数です。 、または(ii)16進数[...]
10進数は、基数文字(小数点、ロケール依存、通常は「。」)を含む可能性のある空でない10進数のシーケンスで構成され、オプションで10進数の指数が続きます。10進数の指数は、「E」または「e」、オプションのプラスまたはマイナス記号、空でない10進数のシーケンスで構成され、10の累乗による乗算を示します。[...]
16進数は、「0x」または「0X」の後に、基数文字を含む可能性のある空でない16進数のシーケンスと、オプションで2進数の指数で構成されます。[...]
ご覧のとおり、「1e1」文字列には空でないシーケンス「1」とそれに続く10進指数「e1」があります。したがって、10進数に変換されて10になります。
'0x1A'文字列は、16進数の規則に従い、それに応じて26に変換されます。ただし、8進数には特定の規則がないため、「042」は単純な10進数に変換されて42になります。もちろん、これは34に等しくありません。
これを、PHP自体による数値リテラルの解析方法と混同しないでください。0で始まる数値リテラルは、8進数を表すと見なされます。したがって、intval(042)
本質的にはintval(34)
-と同じですが、とは異なりintval("042")
ます。