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

Posted

技术标签:

【中文标题】php字符串比较意外类型杂耍【英文标题】:php string comparison unexpected type juggling 【发布时间】: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 特性一样,它包含了太多的魔力。您可以尝试了解类型杂耍的所有例外情况,但最好避免。 【参考方案1】:

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

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

所以如果你跑了

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

你实际运行的是因为它会被视为一个字符串

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

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

FROM PHP DOC

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

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

如果你想欺骗类型杂耍

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

This is Because

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

【讨论】:

您能否在该语句出现的地方放置一个指向 php 文档的链接。谢谢 我不认为 "10 " 会像上面那样变成 0,如果你这样做 (int)("10 ") 它会给你 int(10) (int)("10 ")+"10 " 相同 ????? .. 你在做同样的事情然后你把== 放在一个字符串前面它总是返回 0【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

我明白这一点。我在帖子中描述了相同的过程,但我想知道这种行为记录在任何地方。或者有人可以发布实际做出这些决定的 PHP 内部代码的 sn-p。

以上是关于php字符串比较意外类型杂耍的主要内容,如果未能解决你的问题,请参考以下文章

PHP常见绕过(更新ing)

PHP当中如何将数组当中的字符串数据类型转化为数值类型?

PHP字符串比较

3. PHP比较运算符

php 字符串和数字比较一些问题

php字符串比较函数