4

在比较一些字符串值时,我在 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 在下面的比较中的回答涉及数字字符串,这确实有助于让我理解发生了什么。无论字符串是否被视为数字字符串,函数is_numeric都会返回给您。有趣"10 "的是,它不被视为数字字符串,而是" 10"。我挖掘了 PHP 源代码,我相信 is_numeric 的实现在 is_numeric_string_ex 函数中。从中可以准确判断 PHP 何时将字符串视为数字字符串。

4

3 回答 3

2

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

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

所以如果你跑

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

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

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

这是因为类型杂耍会转换"10 "PHP 文档中的0

来自 PHP 文档

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

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

如果你想欺骗类型杂耍

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

这是因为

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

于 2012-10-13T11:55:12.310 回答
1

我想确定的答案隐藏 compare_function 在 php-src/Zend/zend_operators.c 和其中使用的宏中的某个地方。

于 2012-10-13T12:19:08.087 回答
0

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

在第 3 行中,字符串中有一个空格,这意味着对于 php,这是一个“真实”字符串,并且该行将字符串进行比较。

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

于 2012-10-13T11:51:48.323 回答