【发布时间】:2012-10-04 01:51:03
【问题描述】:
在比较一些字符串值时,我在 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)
更新
所以爸爸在comparison involves numerical strings 下方的回答确实有助于让我了解发生了什么。无论字符串是否被视为数字字符串,函数is_numeric 都会返回给您。有趣的是 "10 " 不被视为数字字符串,但 " 10" 是。我挖掘了 PHP 源代码,我相信 implementation of is_numeric 在 is_numeric_string_ex 函数中。从中可以准确判断 PHP 何时将字符串视为数字字符串。
【问题讨论】:
-
您可以只使用
===或更明确的strcmp/strcasecmp而不是接受类型杂耍。 -
我知道这些选项。我不是在寻找替代方案,我希望了解 == 运算符以及它应用类型杂耍的确切时间和原因
-
不要使用
==运算符。像许多 PHP 特性一样,它包含了太多的魔力。您可以尝试了解类型杂耍的所有例外情况,但最好避免。
标签: php