在比较一些字符串值时,我在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何时将字符串视为数字字符串。
答案 0 :(得分:2)
由于空格的位置会返回true,您收到错误
var_dump("10" == " 10"); // true
所以如果你跑了
var_dump("10" == "10 "); //false
您实际运行的是因为它将被视为字符串
var_dump("10" == 0); //false
这是因为类型杂耍会将"10 "
转换为0
这是PHP Documentation
如果$ j在类型杂耍之后等于$ b,则为TRUE。
如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字,并且数字会进行比较。这些规则也适用于switch语句。当比较为===或!==时,不会发生类型转换,因为这涉及比较类型和值。
如果你想欺骗类型杂耍
var_dump("10" == 0 + "10 "); // true
PHP的自动类型转换的一个例子是加法运算符'+'。如果任一操作数是浮点数,则两个操作数都被计算为浮点数,结果将是浮点数。否则,操作数将被解释为整数,结果也将是整数。请注意,这不会改变操作数本身的类型;唯一的变化是如何评估操作数以及表达式本身的类型。
答案 1 :(得分:1)
我认为明确的答案隐藏在广阔的地方
compare_function
在php-src / Zend / zend_operators.c和那里使用的宏。
答案 2 :(得分:0)
在这种情况下,除最后一个之外的所有“字符串”都被视为浮点数或整数,然后进行比较。这就是第1行和第2行给出真实的原因。
在第3行中,字符串中有一个空格,这意味着php是一个“真正的”字符串,并且该行会比较字符串。
我也不喜欢loose typed
种语言,但对于php,这就是它的工作方式。