php字符串比较意外类型杂耍

时间:2012-10-13 11:40:50

标签: php

在比较一些字符串值时,我在PHP中遇到了奇怪且意外的行为。当我希望它们返回false时,下面的前两个语句将返回true。最后一个语句按预期返回false。我知道PHP的Type Juggling,但我从文档中理解的是,在比较两种不同的数据类型(如字符串和整数)时会发生类型杂耍。在下面的示例中,虽然两个文字都是字符串。这是否意味着当你在PHP中进行字符串比较时,它检查两个字符串以查看它们是否看起来像整数,如果是这样,则将它们两者转换为整数然后比较这些整数值。所以我的问题是在这种行为发生的条件下,字符串比较究竟如何在PHP中工作?

var_dump("10" == "10.0000");
var_dump("10" == "+10.");
var_dump("10" == "10 ");

#output
bool(true)
bool(true)
bool(false)

更新

所以baba在comparison involves numerical strings以下的回答确实帮助我了解了正在发生的事情。函数is_numeric将返回给您,无论字符串是否被视为数字字符串。有趣的是,"10 "不被视为数字字符串," 10"。我挖掘了PHP源代码,我相信implementation of is_numeric在is_numeric_string_ex函数中。从中可以确切地知道PHP何时将字符串视为数字字符串。

3 个答案:

答案 0 :(得分:2)

由于空格的位置会返回true,您收到错误

var_dump("10" == " 10"); // true

所以如果你跑了

var_dump("10" == "10 "); //false

您实际运行的是因为它将被视为字符串

var_dump("10" == 0); //false

这是因为类型杂耍会将"10 "转换为0这是PHP Documentation

FROM PHP DOC

  

如果$ j在类型杂耍之后等于$ b,则为TRUE。

     

如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字,并且数字会进行比较。这些规则也适用于switch语句。当比较为===或!==时,不会发生类型转换,因为这涉及比较类型和值。

如果你想欺骗类型杂耍

var_dump("10" == 0 + "10 ");  // true

This is Because

  

PHP的自动类型转换的一个例子是加法运算符'+'。如果任一操作数是浮点数,则两个操作数都被计算为浮点数,结果将是浮点数。否则,操作数将被解释为整数,结果也将是整数。请注意,这不会改变操作数本身的类型;唯一的变化是如何评估操作数以及表达式本身的类型。

答案 1 :(得分:1)

我认为明确的答案隐藏在广阔的地方 compare_function 在php-src / Zend / zend_operators.c和那里使用的宏。

答案 2 :(得分:0)

在这种情况下,除最后一个之外的所有“字符串”都被视为浮点数或整数,然后进行比较。这就是第1行和第2行给出真实的原因。

在第3行中,字符串中有一个空格,这意味着php是一个“真正的”字符串,并且该行会比较字符串。

我也不喜欢loose typed种语言,但对于php,这就是它的工作方式。

相关问题