【问题标题】:Type-juggling and (strict) greater/lesser-than comparisons in PHPPHP中的类型杂耍和(严格)大于/小于比较
【发布时间】:2013-03-26 15:53:27
【问题描述】:

PHP 以其类型杂耍而闻名。我必须承认这让我很困惑,而且我很难在比较中找出基本的逻辑/基本内容。

例如:如果$a > $b 为真且$b > $c 为真,是否意味着$a > $c总是为真?

按照基本逻辑,我会说是的,但是我很困惑,我在这方面并不真正信任 PHP。也许有人可以提供一个不是这种情况的例子?

我还想知道严格的小于和严格的大于运算符(因为它们的含义被严格描述为我过去只从相等比较中知道的)如果左右操作数有什么区别用严格不相等的值交换:

# Precondition:
if ($a === $b) {
    throw new Exception(
       'Both are strictly equal - can not compare strictly for greater or smaller'
    );
}

($a > $b) !== ($b > $a)

对于大多数类型比较组合,这些greater / lesser comparison operators 没有记录,因此在这种情况下阅读手册并没有真正的帮助。

【问题讨论】:

  • 我猜你想将该行更正为 ($a > $b) !== ($b < $a)
  • 啊,好吧,所以我误解了。将不得不相应地修正我的答案。有趣的是所有那些写论文而不是答案而不仔细阅读你的问题的人......

标签: php if-statement comparison logic ieee-754


【解决方案1】:

PHP (至少在 PHP 5.6.14 中)中有 没有 严格相同比较运算符(>==<==,但有几种方法可以在检查大/小之前执行严格的类型检查

  1. if (gettype($a) === gettype($b))检查两种变量类型
  2. 强制您需要的类型转换,例如。 if ((string)$a === (string)$b)
  3. 强制您需要的类型杂耍,例如。 if (($a . '') === ($b . ''))

请注意:

  • Floating point precision有限
  • INFNAN 下属于 float
  • 一些 Infinity 等于一些其他 Infinity(自 PHP 5.4 起)
  • 科学记数法e 始终是float 类型,并且永远不会是integer,即使数字很小
  • 超过PHP_INT_MAX 的整数会自动转换为float
  • 在系统边界上的浮点数获​​得INF
  • 未定义变量的类型和值NULL
  • 0 前面的整数从八进制转换为十进制(按照约定)
  • 将包含具有前导0 的整数的字符串转换为 整数去除前导0

一些奇特的比较列表:

很奇怪: $一个VS。 $b $a>$b $a=$b $a==$b $a===$b 浮动(NAN)浮动(-INF)假假假假假假假 浮动(南)浮动(0)假假假假假假假 浮动(南) 浮动(1) 假假假假假假假 浮动(NAN) 浮动(INF) 假假假假假假 浮动(南) 浮动(南) 假假假假假假假 float(NAN) int(-1) 假假假假假假 float(NAN) int(0) 假 假 假 假 假 假 float(NAN) int(1) 假 假 假 假 假 假

相等但不相同:

$一个VS。 $b $a>$b $a=$b $a==$b $a===$b NULL(NULL) array() 假 假 真 真 真 假 NULL(NULL) bool(false) false false true true true false NULL(NULL) float(0) 假 假 真 真 真 假 NULL(NULL) int(0) 假 假 真 真 真 假 NULL(NULL) str('') false false true true true false 数组()布尔(假)假假真真真假 bool(false) float(0) false false true true true false bool(false) int(0) false false true true true false str('') bool(false) false false true true true false bool(false) str('0') false false true true true false float(-INF) bool(true) false false true true true false bool(true) float(1) false false true true true false 浮动(INF)布尔(真)假假真真真假 float(NAN) bool(true) false false true true true false bool(true) int(-1) false false true true true false bool(true) int(1) false false true true true false bool(true) str("\0") false false true true true false bool(true) str('+') false false true true true false bool(true) str('-') false false true true true false bool(true) str('01') false false true true true false bool(true) str('1') false false true true true false bool(true) str('false') false false true true true false str('text') bool(true) false false true true true false str('true') bool(true) false false true true true false int(0) float(0) false false true true true false str("\0") float(0) false false true true true false str('') float(0) 假 假 真 真 真 假 str('+') float(0) false false true true true false str('-') float(0) false false true true true false str('0') float(0) false false true true true false str('false') float(0) false false true true true false str('text') float(0) false false true true true false str('true') float(0) false false true true true false int(1) float(1) 假 假 真 真 真 假 float(1) str('01') 假 假 真 真 真 假 float(1) str('1') 假 假 真 真 真 假 str("\0") int(0) false false true true true false str('') int(0) 假 假 真 真 真 假 str('+') int(0) false false true true true false str('-') int(0) false false true true true false int(0) str('0') false false true true true false str('false') int(0) 假 假 真 真 真 假 str('text') int(0) false false true true true false str('true') int(0) false false true true true false int(1) str('01') 假 假 真 真 真 假 int(1) str('1') 假 假 真 真 真 假 str('1') str('01') false false true true true false

同时降低和提高?

$一个VS。 $b $a>$b $a=$b $a==$b $a===$b float(NAN) str("\0") 真真真真假假 float(NAN) str('') true true true false false float(NAN) str('+') true true true false false float(NAN) str('-') true true true false false float(NAN) str('0') true true true false false float(NAN) str('01') true true true false false float(NAN) str('1') true true true false false float(NAN) str('false') true true true false false float(NAN) str('text') true true true false false float(NAN) str('true') true true true false false

相等且相同:

$一个VS。 $b $a>$b $a=$b $a==$b $a===$b NULL(NULL) NULL(NULL) 假 假 真 真 真 真 浮动(-INF) 浮动(-INF) 假 假 真 真 真 真 浮动(INF)浮动(INF)假假真真真真真假

更低或更高:

$一个VS。 $b $a>$b $a=$b $a==$b $a===$b NULL(NULL) bool(true) false true true false false false float(-INF) NULL(NULL) 真假假真假假 NULL(NULL) float(1) 假真真假假假 浮动(INF) NULL(NULL) 真假假真假假 float(NAN) NULL(NULL) 真假假真假假 NULL(NULL) int(-1) false true true false false false NULL(NULL) int(1) 假真真假假假 NULL(NULL) str("\0") false true true false false false NULL(NULL) str('+') false true true false false false NULL(NULL) str('-') false true true false false false NULL(NULL) str('0') false true true false false false NULL(NULL) str('01') false true true false false false NULL(NULL) str('1') false true true false false false NULL(NULL) str('false') false true true false false false NULL(NULL) str('text') false true true false false false NULL(NULL) str('true') false true true false false false array() bool(true) false true true false false false 浮动(-INF)数组()假真真假假假假 数组()浮点(0)真假假真假假 数组()浮点数(1)真假假真假假 浮动(INF)数组()假真真假假假 浮动(NAN)数组()假真真假假假 array() int(-1) 真假假真假假 array() int(0) 真假假真假假 array() int(1) 真假假真假假 array() str("\0") 真假假真假假 str('') 数组() 假真真假假假 array() str('+') true false false true false false array() str('-') true false false true false false array() str('0') 真假假真假假 array() str('01') 真假假真假假 array() str('1') 真假假真假假 array() str('false') true false false true false false array() str('text') true false false true false false array() str('true') true false false true false false bool(true) bool(false) true false false true false false 浮动(-INF)布尔(假)真假假真假假 float(1) bool(false) true false false true false false 浮动(INF)布尔(假)真假假假真假假 浮动(南)布尔(假)真假假假真假假 bool(false) int(-1) false true true false false false int(1) bool(false) 真假假假真假假 bool(false) str("\0") false true true false false false bool(false) str('+') false true true false false false bool(false) str('-') false true true false false false bool(false) str('01') false true true false false false str('1') bool(false) true false false true false false bool(false) str('false') false true true false false false str('text') bool(false) true false false true false false str('true') bool(false) true false false true false false bool(true) float(0) true false false true false false bool(true) int(0) true false false true false false str('') bool(true) false true true false false false bool(true) str('0') true false false true false false 浮动(-INF)浮动(0)假真真假假假 浮动(-INF)浮动(1)假真真假假假 浮动(INF)浮动(-INF)真假假真假假 float(-INF) int(-1) false true true false false false float(-INF) int(0) false true true false false false float(-INF) int(1) false true true false false false float(-INF) str("\0") false true true false false false float(-INF) str('') false true true false false false float(-INF) str('+') false true true false false false float(-INF) str('-') false true true false false false float(-INF) str('0') false true true false false false float(-INF) str('01') false true true false false false float(-INF) str('1') false true true false false false float(-INF) str('false') false true true false false false float(-INF) str('text') false true true false false false float(-INF) str('true') false true true false false false 浮动(1) 浮动(0) 真假假真假假 浮动(INF)浮动(0)真假假真假假 float(0) int(-1) 真假假假真假假 int(1) float(0) 真假假真假假 float(0) str('01') false true true false false false str('1') float(0) 真假假真假假 浮动(INF)浮动(1)真假假真假假 float(1) int(-1) 真假假真假假 float(1) int(0) 真假假真假假 float(1) str("\0") 真假假真假假 str('') float(1) 假真真假假假 float(1) str('+') 真假假真假假 float(1) str('-') true false false true false false float(1) str('0') 真假假真假假 float(1) str('false') 真假假假真假假 str('text') float(1) false true true false false false str('true') float(1) false true true false false false float(INF) int(-1) 真假假真假假 float(INF) int(0) 真假假假真假假 float(INF) int(1) 真假假真假假 float(INF) str("\0") 真假假真假假 float(INF) str('') 真假假假真假假 float(INF) str('+') 真假假真假假 float(INF) str('-') 真假假真假假 浮动(INF)str('0')真假假真假假 浮动(INF)str('01')真假假真假假 浮动(INF)str('1')真假假真假假 float(INF) str('false') 真假假真假假 浮动(INF)str('文本')真假假真假假 float(INF) str('true') 真假假真假假 int(0) int(-1) 真假假真假假 int(1) int(-1) 真假假真假假 str("\0") int(-1) 真假假真假假 str('') int(-1) 真假假真假假 str('+') int(-1) 真假假真假假 str('-') int(-1) true false false true false false str('0') int(-1) 真假假真假假 int(-1) str('01') false true true false false false str('1') int(-1) 真假假真假假 str('false') int(-1) 真假假真假假 str('text') int(-1) true false false true false false str('true') int(-1) 真假假真假假 int(1) int(0) 真假假真假假 int(0) str('01') false true true false false false str('1') int(0) 真假假真假假 int(1) str("\0") 真假假真假假 str('') int(1) 假真真假假假 int(1) str('+') 真假假真假假 int(1) str('-') 真假假真假假 int(1) str('0') 真假假真假假 int(1) str('false') 真假假真假假 str('text') int(1) false true true false false false str('true') int(1) false true true false false false str('') str("\0") false true true false false false str('+') str("\0") true false false true false false str('-') str("\0") true false false true false false str("\0") str('0') false true true false false false str("\0") str('01') false true true false false false str('1') str("\0") 真假假真假假 str('false') str("\0") true false false true false false str('text') str("\0") true false false true false false str('true') str("\0") true false false true false false str('') str('+') false true true false false false str('') str('-') false true true false false false str('') str('0') false true true false false false str('') str('01') false true true false false false str('') str('1') false true true false false false str('') str('false') false true true false false false str('') str('text') false true true false false false str('') str('true') false true true false false false str('-') str('+') 真假假真假假 str('+') str('0') false true true false false false str('+') str('01') false true true false false false str('1') str('+') 真假假真假假 str('false') str('+') true false false true false false str('text') str('+') true false false true false false str('true') str('+') true false false true false false str('-') str('0') false true true false false false str('-') str('01') false true true false false false str('1') str('-') true false false true false false str('false') str('-') true false false true false false str('text') str('-') true false false true false false str('true') str('-') true false false true false false str('0') str('01') false true true false false false str('1') str('0') 真假假真假假 str('false') str('0') true false false true false false str('text') str('0') true false false true false false str('true') str('0') true false false true false false str('false') str('01') true false false true false false str('text') str('01') true false false true false false str('true') str('01') true false false true false false str('1') str('false') false true true false false false str('text') str('1') true false false true false false str('true') str('1') true false false true false false str('text') str('false') true false false true false false str('true') str('false') true false false true false false str('true') str('text') true false false true false false

$a > $b > $c 难题何时:$a 不大于 $c

A&ltC : float(NAN) &gt str('a') &gt str('') A&ltC : 浮点数(NAN) &gt str('a') &gt str('1') A&ltC : 浮点数(NAN) &gt str('a') &gt str('A') A&ltC : 浮点数(NAN) &gt str('a') &gt str('0') A&ltC : 浮点数(NAN) &gt str('1') &gt str('') A&ltC : 浮点数(NAN) &gt str('1') &gt str('0') A&ltC : 浮点数(NAN) &gt str('A') &gt str('') A&ltC : 浮点数(NAN) &gt str('A') &gt str('1') A&ltC : 浮点数(NAN) &gt str('A') &gt str('0') A&ltC : 浮点数(NAN) &gt str('0') &gt str('') A&ltC : str('') &gt float(NAN) &gt str('a') A&ltC : str('') &gt float(NAN) &gt str('1') A&ltC : str('') &gt float(NAN) &gt str('A') A&ltC : str('') &gt float(NAN) &gt str('0') A&ltC : str('a') &gt str('') &gt float(NAN) A&ltC : str('a') &gt str('1') &gt float(NAN) A&ltC : str('a') &gt str('A') &gt float(NAN) A&ltC : str('a') &gt str('0') &gt float(NAN) A&ltC : str('0') &gt str('') &gt float(NAN) A==C : bool(true) &gt str('') &gt float(NAN) A==C : bool(true) &gt str('') &gt float(-INF) A==C : bool(true) &gt str('') &gt int(-1) A==C : bool(true) &gt str('') &gt float(-1) A==C : bool(true) &gt array() &gt float(NAN) A==C : bool(true) &gt array() &gt float(INF) A==C : bool(true) &gt array() &gt float(-INF) A==C : bool(true) &gt array() &gt str('a') A==C : bool(true) &gt array() &gt int(1) A==C : bool(true) &gt array() &gt float(1) A==C : bool(true) &gt array() &gt str('1') A==C : bool(true) &gt array() &gt str('A') A==C : bool(true) &gt array() &gt int(-1) A==C : bool(true) &gt array() &gt float(-1) A==C : bool(true) &gt int(0) &gt float(-INF) A==C : bool(true) &gt int(0) &gt int(-1) A==C : bool(true) &gt int(0) &gt float(-1) A==C : bool(true) &gt str('0') &gt float(NAN) A==C : bool(true) &gt str('0') &gt float(-INF) A==C : bool(true) &gt str('0') &gt int(-1) A==C : bool(true) &gt str('0') &gt float(-1) A==C : bool(true) &gt float(0) &gt float(-INF) A==C : bool(true) &gt float(0) &gt int(-1) A==C : bool(true) &gt float(0) &gt float(-1) A==C : int(1) &gt str('a') &gt str('1') A==C : int(1) &gt str('A') &gt str('1') A==C : 浮点数(1) &gt str('a') &gt str('1') A==C : 浮点数(1) &gt str('A') &gt str('1') A==C : str('a') &gt str('1') &gt int(0) A==C : str('a') &gt str('1') &gt float(0) A==C : str('') &gt float(-INF) &gt NULL(NULL) A==C : str('') &gt float(-INF) &gt bool(false) A==C : str('') &gt int(-1) &gt NULL(NULL) A==C : str('') &gt int(-1) &gt bool(false) A==C : str('') &gt float(-1) &gt NULL(NULL) A==C : str('') &gt float(-1) &gt bool(false) A==C : 数组() &gt 浮点数(NAN) &gt NULL(NULL) A==C:数组()&gt浮点(NAN)&gt布尔(假) A==C:数组()&gt浮点(INF)&gt NULL(NULL) A==C:数组()&gt浮点(INF)&gt布尔(假) A==C:数组()&gt浮点(-INF)&gt NULL(NULL) A==C:数组()&gt浮点(-INF)&gt布尔(假) A==C : 数组() &gt str('a') &gt NULL(NULL) A==C : 数组() &gt str('a') &gt bool(false) A==C:数组()&gt int(1)&gt NULL(NULL) A==C:数组()&gt int(1)&gt bool(假) A==C : 数组() &gt 浮点数(1) &gt NULL(NULL) A==C:数组()&gt浮点(1)&gt布尔(假) A==C : 数组() &gt str('1') &gt NULL(NULL) A==C : 数组() &gt str('1') &gt bool(false) A==C : 数组() &gt str('A') &gt NULL(NULL) A==C : 数组() &gt str('A') &gt bool(false) A==C:数组()&gt str('0')&gt NULL(NULL) A==C:数组()&gt int(-1)&gt NULL(NULL) A==C:数组()&gt int(-1)&gt bool(假) A==C:数组()&gt浮点(-1)&gt NULL(NULL) A==C:数组()&gt浮点(-1)&gt布尔(假) A==C : str('') &gt float(NAN) &gt bool(false) A==C : str('') &gt float(NAN) &gt NULL(NULL) A==C : str('A') &gt str('1') &gt int(0) A==C : str('A') &gt str('1') &gt float(0) A==C : int(0) &gt float(-INF) &gt NULL(NULL) A==C : int(0) &gt float(-INF) &gt bool(false) A==C : int(0) &gt int(-1) &gt NULL(NULL) A==C : int(0) &gt int(-1) &gt bool(false) A==C : int(0) &gt float(-1) &gt NULL(NULL) A==C : int(0) &gt float(-1) &gt bool(false) A==C : str('0') &gt float(NAN) &gt bool(false) A==C : str('0') &gt float(-INF) &gt bool(false) A==C : str('0') &gt int(-1) &gt bool(false) A==C : str('0') &gt float(-1) &gt bool(false) A==C : 浮点数(0) &gt 浮点数(-INF) &gt NULL(NULL) A==C : 浮点数(0) &gt 浮点数(-INF) &gt bool(false) A==C : 浮点数(0) &gt int(-1) &gt NULL(NULL) A==C : 浮点数(0) &gt int(-1) &gt bool(false) A==C : 浮点数(0) &gt 浮点数(-1) &gt NULL(NULL) A==C : 浮点数(0) &gt 浮点数(-1) &gt bool(false) A===C : str('0') &gt float(NAN) &gt str('0') A===C : str('') &gt float(NAN) &gt str('') A===C : str('a') &gt float(NAN) &gt str('a') A===C : str('1') &gt float(NAN) &gt str('1') A===C : str('A') &gt float(NAN) &gt str('A')

有趣的字符串比较:'Queen'>'King'>'Jack'>'Ace'

还可以查看PHP type comparison tables 覆盖对:

  • isset()is_null()
  • if()empty()
  • 布尔值=====

检查实时 PHP 版本之间的差异。 http://3v4l.org/MAfDu.

【讨论】:

  • +1 更不用说带有固定列标题的可滚动“表格” - 好主意;)
  • 类型转换时是否需要使用严格的运算符?我的意思是你写了if ( (string)$a===(string)$b ),但这和if ( (string)$a==(string)$b )不完全一样吗?
  • @Voitcus 是类型转换(string)1==(string)'01' -> bool(true) 和类型杂耍(1 . '')=='01' -> bool(true)完全 与@ 相同987654361@ 当您在两个帐户上都获得bool(false)
  • 一个挑剔:八进制值不会“在赋值时转换”,它们由编译器解释,编译器必须将 ASCII 转换为实际的二进制数。
  • INFINITY is equal to INFINITY which is mathematically incorrect! 是一个绝对值得商榷的声明。另请注意,NaN 按照惯例不大于、小于或等于我所知道的任何编程语言中的任何值。
【解决方案2】:

在您更正问题的第二部分后,我将这部分的答案留给其他人。我只想对您的问题的第一部分给出最令人惊讶的答案,即是否存在 <> 运算符不及物的示例。在这里。

这些都是true:

"10" < "1a"
"1a" < "2"
"10" > "2"

如果&lt; 是可传递的($a &lt; $b$b &lt; $c$a &lt; $c),那么最后一行是

"10" < "2"

但 PHP 会尽量保持友善 (?!) 并尽可能将字符串解释为数字。

事实证明,由于上述不传递性,sort() 可以根据输入顺序将相同元素排序为不同顺序,甚至当没有两个元素是 == 时(并且没有元素是 NAN)。我在comment to sort()中指出了这一点,其实质是:

sort(array("10", "1a", "2" )) => array("10", "1a", "2" )
sort(array("10", "2",  "1a")) => array("1a", "2",  "10")
sort(array("1a", "10", "2" )) => array("2",  "10", "1a")
sort(array("1a", "2",  "10")) => array("1a", "2",  "10")
sort(array("2",  "10", "1a")) => array("2",  "10", "1a")
sort(array("2",  "1a", "10")) => array("10", "1a", "2" )

【讨论】:

  • 上一条评论指的是我同时删除的部分答案(与问题的第二部分有关)
  • 现在删除了 ;) 还有不错的新 sort() 表,在撰写相关博客文章 The Greatest PHP Value 时也选择了它以产生实际影响。再次感谢您的回答。
  • 这是否意味着应该尽可能使用usort
  • @Voitcus:我猜你的意思是usort($arr, 'strcmp')。这有效(当然适用于字符串),但最好使用sort($arr, SORT_STRING)
  • @WalterTross 我的意思是始终使用您自己的函数(不仅用于字符串)以确保它始终正确
【解决方案3】:

PHP 的比较运算符在几个方面偏离了计算机科学的定义:

为了构成等价关系 == 必须是自反的、对称的和传递的:

  • PHP 的== 运算符不是自反的,即$a == $a 并不总是正确的:

    var_dump(NAN == NAN); // bool(false)
    

    注意:任何涉及NAN 的比较总是false 这一事实并非特定于PHP。它由 IEEE 754 浮点算术标准 (more info) 强制执行。

  • PHP 的== 运算符是对称的,即$a == $b$b == $a 始终相同。

  • PHP 的== 运算符不传递,即从$a == $b$b == $c 跟随$a == $c

    var_dump(true == "a"); // bool(true)
    var_dump("a" == 0);    // bool(true)
    var_dump(true == 0);   // bool(false)
    

为了构成一个偏序 &lt;=/&gt;= 必须是自反的、反对称的和传递的:

  • PHP 的&lt;= 运算符不是自反的,即$a &lt;= $a 并不总是正确的(示例与== 相同)。

  • PHP 的&lt;= 运算符非反对称,即来自$a &lt;= $b$b &lt;= $a 不遵循$a == $b

    var_dump(NAN <= "foo"); // bool(true)
    var_dump("foo" <= NAN); // bool(true)
    var_dump(NAN == "foo"); // bool(false)
    
  • PHP 的&lt;= 运算符不可传递,即来自$a &lt;= $b$b &lt;= $c 不跟随$a &lt;= $c(示例与== 相同)。

  • 额外:PHP 的&lt;= 运算符不是全部,即$a &lt;= $b$b &lt;= $a 都可以为假:

    var_dump(new stdClass <= new DateTime); // bool(false)
    var_dump(new DateTime <= new stdClass); // bool(false)
    

为了构成一个严格的偏序 &lt;/&gt; 必须是非自反的、不对称的和传递的:

  • PHP 的&lt; 运算符是非自反的,即$a &lt; $a 永远不会为真。请注意,仅从 PHP 5.4 开始才是正确的。以前 INF &lt; INF 评估为 true

  • PHP 的&lt; 运算符不是不对称的,即来自$a &lt; $b 不遵循!($b &lt; $a)(示例与&lt;= 相同,不是反对称的)。

  • PHP 的&lt; 运算符不传递,即来自$a &lt; $b$b &lt; $c 不遵循$a &lt; $c

    var_dump(-INF < 0);    // bool(true)
    var_dump(0 < TRUE);    // bool(true)
    var_dump(-INF < TRUE); // bool(false)
    
  • 额外:PHP 的&lt; 运算符不是三分法,即所有$a &lt; $b$b &lt; $a$a == $b 可以为假(示例与&lt;= 相同总计)。

  • 额外:PHP 的&lt; 运算符可以是循环的,即$a &lt; $b$b &lt; $c$c &lt; $a

    var_dump(INF < []);           // bool(true)
    var_dump([] < new stdClass);  // bool(true)
    var_dump(new stdClass < INF); // bool(true)
    

    注意:上面的例子抛出了“Object of class stdClass could not be convert to double”的提示。

您可以在PHP Sadness 52 - Comparison operators 上找到一些关于 PHP 比较运算符的漂亮图表。

作为最后一点,我想指出 PHP 确实 保证了两个等式(与几乎所有其他内容不同)。这两个总是成立,仅仅是因为编译器将一个简化为另一个:

($a > $b) == ($b < $a)
($a >= $b) == ($b <= $a)

【讨论】:

  • 哇,不错的答案。因此,即使文档说那些 &lt; / &gt; 操作员说它们是 strict?
  • 恕我直言运算符确实遵循数学规则,但仅在处理相同的数据类型时。类型转换是在这里(以及在许多其他情况下)真正造成混乱的原因。当比较数字和字符串以及特殊值类型转换在运算符之前完成,所以严格来说比较运算符不会混淆,强制转换是......
  • @ivanhoe011 事实是:两者都是:) PHP的比较规则和PHP的强制转换规则不同,不能简单的说$a == $b和@987654387一样@。一个简单的例子是"15" == "0xf",但是(int) "15" !== (int) "0xf"。 PHP中的比较和强制转换规则都非常疯狂^^
  • @NikiC: (int)"0xf" 计算为整数 0,所以当然是 0 !== 15。此示例中的比较行为完全符合预期。在这里令人困惑的是演员阵容。我承认,(INF &lt; INF) === true 是一个真正的比较问题,但它是一个特例,正如你所指出的,它已经解决了。很好的答案.. +1
  • 我不一定会因为当时对类型强制的一些决定而责怪 PHP 的设计者......但我觉得应该注意到这些设计选择的结果和立即意识到选择显然是错误的。最明显的例子是@ravz 的评论。
猜你喜欢
  • 2012-10-04
  • 2012-02-22
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多