杂耍和(严格)大/小
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)
对于大多数类型比较组合,这些较大/较小的比较运算符没有记录,因此在这种情况下阅读手册并没有真正的帮助。
PHP的比较运算符在几个方面偏离了计算机科学的定义:
为了构成等价关系, ==
必须是自反的,对称的和传递的:
PHP的==
运算符不是自反的 ,即$a == $a
并不总是对的:
var_dump(NAN == NAN); // bool(false)
注意:涉及NAN
任何比较总是为false
的事实并不特定于PHP。 它是IEEE 754浮点运算标准的要求(更多信息)。
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)
为了构成偏序<=
/ >=
必须是自反的,反对称和传递性的:
PHP的<=
运算符不是自反的 ,即$a <= $a
并不总是如此(例子与==
相同)。
PHP的<=
运算符不是反对称的 ,即从$a <= $b
和$b <= $a
不符合$a == $b
:
var_dump(NAN <= "foo"); // bool(true)
var_dump("foo" <= NAN); // bool(true)
var_dump(NAN == "foo"); // bool(false)
PHP的<=
运算符不是传递的 ,即从$a <= $b
和$b <= $c
不跟随$a <= $c
(例子与==
相同)。
额外:PHP的<=
运算符不是总数 ,即$a <= $b
和$b <= $a
都可以是false:
var_dump(new stdClass <= new DateTime); // bool(false)
var_dump(new DateTime <= new stdClass); // bool(false)
为了构成一个严格的偏序<
/ >
必须是非反射的,不对称的和传递性的:
PHP的<
操作符是不反射的 ,即$a < $a
永远不会是真的。 请注意,这仅在PHP 5.4时才是真实的。 以前INF < INF
评估为true
。
PHP的<
运算符不是不对称的 ,即从$a < $b
不跟随!($b < $a)
(示例与<=
不是反对称)相同。
PHP的<
操作符不是传递的 ,即从$a < $b
和$b < $c
不跟随$a < $c
:
var_dump(-INF < 0); // bool(true)
var_dump(0 < TRUE); // bool(true)
var_dump(-INF < TRUE); // bool(false)
额外:PHP的<
运算符不是三元的 ,也就是说, $a < $b
, $b < $a
和$a == $b
都可以是假的(例子相同于<=
不是总数)。
额外:PHP的<
运算符可以是循环的 ,即可能$a < $b
, $b < $c
和$c < $a
:
var_dump(INF < []); // bool(true)
var_dump([] < new stdClass); // bool(true)
var_dump(new stdClass < INF); // bool(true)
注意:上面的例子抛出了“class stdClass的对象无法转换为double”通知。
您可以在PHP悲伤52 - 比较运算符上找到一些关于PHP比较运算符的漂亮图表。
作为最后一点,我想指出的是PHP确实有两个平等点(不像其他所有内容)。 这两者总是成立,只是因为编译器会将其中一个减少到另一个:
($a > $b) == ($b < $a)
($a >= $b) == ($b <= $a)
PHP中没有严格相同的比较运算符( >==
或<==
)(至少PHP 5.6.14),但有几种方法在检查Greater / Lower之前执行严格类型检查 :
if (gettype($a) === gettype($b))
检查两个变量类型 if ((string)$a === (string)$b)
if (($a . '') === ($b . ''))
请注意:
INF
和NAN
是型的float
下IEEE754 e
始终为float
类型,即使数字很小也不会integer
PHP_INT_MAX
会自动转换为float
INF
值 NULL
0
结尾的整数从八进制转换为十进制(按照惯例) 0
的整数的字符串转换为整数将去除前导0
一些奇特的比较列表:
Very strange: $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b float(NAN) float(-INF) false false false false false false float(NAN) float(0) false false false false false false float(NAN) float(1) false false false false false false float(NAN) float(INF) false false false false false false float(NAN) float(NAN) false false false false false false float(NAN) int(-1) false false false false false false float(NAN) int(0) false false false false false false float(NAN) int(1) false false false false false false
相同但不相同:
$a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b
NULL(NULL) array() false false true true true false NULL(NULL) bool(false) false false true true true false NULL(NULL) float(0) false false true true true false NULL(NULL) int(0) false false true true true false NULL(NULL) str('') false false true true true false array() bool(false) 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 float(INF) bool(true) false false true true true false 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(" ") 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(" ") float(0) false false true true true false str('') float(0) false false true true true false 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) false false true true true false float(1) str('01') false false true true true false float(1) str('1') false false true true true false str(" ") int(0) false false true true true false str('') int(0) false false true true true false 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) false false true true true false str('text') int(0) false false true true true false str('true') int(0) false false true true true false int(1) str('01') false false true true true false int(1) str('1') false false true true true false str('1') str('01') false false true true true false
同时降低和更大?
$a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b float(NAN) str(" ") true true true true false false float(NAN) str('') true true true true false false float(NAN) str('+') true true true true false false float(NAN) str('-') true true true true false false float(NAN) str('0') true true true true false false float(NAN) str('01') true true true true false false float(NAN) str('1') true true true true false false float(NAN) str('false') true true true true false false float(NAN) str('text') true true true true false false float(NAN) str('true') true true true true false false
相同且相同:
$a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b NULL(NULL) NULL(NULL) false false true true true true float(-INF) float(-INF) false false true true true true float(INF) float(INF) false false true true true true
更低或更高:
$a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b
NULL(NULL) bool(true) false true true false false false float(-INF) NULL(NULL) true false false true false false NULL(NULL) float(1) false true true false false false float(INF) NULL(NULL) true false false true false false float(NAN) NULL(NULL) true false false true false false NULL(NULL) int(-1) false true true false false false NULL(NULL) int(1) 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('-') 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 float(-INF) array() false true true false false false array() float(0) true false false true false false array() float(1) true false false true false false float(INF) array() false true true false false false float(NAN) array() false true true false false false array() int(-1) true false false true false false array() int(0) true false false true false false array() int(1) true false false true false false array() str(" ") true false false true false false str('') array() false true true false false false array() str('+') true false false true false false array() str('-') true false false true false false array() str('0') true false false true false false array() str('01') true false false true false false array() str('1') true false false true false false 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 float(-INF) bool(false) true false false true false false float(1) bool(false) true false false true false false float(INF) bool(false) true false false true false false float(NAN) bool(false) true false false true false false bool(false) int(-1) false true true false false false int(1) bool(false) true false false true false false bool(false) str(" ") 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 float(-INF) float(0) false true true false false false float(-INF) float(1) false true true false false false float(INF) float(-INF) true false false true false false 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(" ") 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 float(1) float(0) true false false true false false float(INF) float(0) true false false true false false float(0) int(-1) true false false true false false int(1) float(0) true false false true false false float(0) str('01') false true true false false false str('1') float(0) true false false true false false float(INF) float(1) true false false true false false float(1) int(-1) true false false true false false float(1) int(0) true false false true false false float(1) str(" ") true false false true false false str('') float(1) false true true false false false float(1) str('+') true false false true false false float(1) str('-') true false false true false false float(1) str('0') true false false true false false float(1) str('false') true false false true false 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) true false false true false false float(INF) int(0) true false false true false false float(INF) int(1) true false false true false false float(INF) str(" ") true false false true false false float(INF) str('') true false false true false false float(INF) str('+') true false false true false false float(INF) str('-') true false false true false false float(INF) str('0') true false false true false false float(INF) str('01') true false false true false false float(INF) str('1') true false false true false false float(INF) str('false') true false false true false false float(INF) str('text') true false false true false false float(INF) str('true') true false false true false false int(0) int(-1) true false false true false false int(1) int(-1) true false false true false false str(" ") int(-1) true false false true false false str('') int(-1) true false false true false false str('+') int(-1) true false false true false false str('-') int(-1) true false false true false false str('0') int(-1) true false false true false false int(-1) str('01') false true true false false false str('1') int(-1) true false false true false false str('false') int(-1) true false false true false false str('text') int(-1) true false false true false false str('true') int(-1) true false false true false false int(1) int(0) true false false true false false int(0) str('01') false true true false false false str('1') int(0) true false false true false false int(1) str(" ") true false false true false false str('') int(1) false true true false false false int(1) str('+') true false false true false false int(1) str('-') true false false true false false int(1) str('0') true false false true false false int(1) str('false') true false false true false false str('text') int(1) false true true false false false str('true') int(1) false true true false false false str('') str(" ") false true true false false false str('+') str(" ") true false false true false false str('-') 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('') 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('+') 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('-') 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') true false false true false false 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<C : float(NAN) > str('a') > str('') A<C : float(NAN) > str('a') > str('1') A<C : float(NAN) > str('a') > str('A') A<C : float(NAN) > str('a') > str('0') A<C : float(NAN) > str('1') > str('') A<C : float(NAN) > str('1') > str('0') A<C : float(NAN) > str('A') > str('') A<C : float(NAN) > str('A') > str('1') A<C : float(NAN) > str('A') > str('0') A<C : float(NAN) > str('0') > str('') A<C : str('') > float(NAN) > str('a') A<C : str('') > float(NAN) > str('1') A<C : str('') > float(NAN) > str('A') A<C : str('') > float(NAN) > str('0') A<C : str('a') > str('') > float(NAN) A<C : str('a') > str('1') > float(NAN) A<C : str('a') > str('A') > float(NAN) A<C : str('a') > str('0') > float(NAN) A<C : str('0') > str('') > float(NAN) A==C : bool(true) > str('') > float(NAN) A==C : bool(true) > str('') > float(-INF) A==C : bool(true) > str('') > int(-1) A==C : bool(true) > str('') > float(-1) A==C : bool(true) > array() > float(NAN) A==C : bool(true) > array() > float(INF) A==C : bool(true) > array() > float(-INF) A==C : bool(true) > array() > str('a') A==C : bool(true) > array() > int(1) A==C : bool(true) > array() > float(1) A==C : bool(true) > array() > str('1') A==C : bool(true) > array() > str('A') A==C : bool(true) > array() > int(-1) A==C : bool(true) > array() > float(-1) A==C : bool(true) > int(0) > float(-INF) A==C : bool(true) > int(0) > int(-1) A==C : bool(true) > int(0) > float(-1) A==C : bool(true) > str('0') > float(NAN) A==C : bool(true) > str('0') > float(-INF) A==C : bool(true) > str('0') > int(-1) A==C : bool(true) > str('0') > float(-1) A==C : bool(true) > float(0) > float(-INF) A==C : bool(true) > float(0) > int(-1) A==C : bool(true) > float(0) > float(-1) A==C : int(1) > str('a') > str('1') A==C : int(1) > str('A') > str('1') A==C : float(1) > str('a') > str('1') A==C : float(1) > str('A') > str('1') A==C : str('a') > str('1') > int(0) A==C : str('a') > str('1') > float(0) A==C : str('') > float(-INF) > NULL(NULL) A==C : str('') > float(-INF) > bool(false) A==C : str('') > int(-1) > NULL(NULL) A==C : str('') > int(-1) > bool(false) A==C : str('') > float(-1) > NULL(NULL) A==C : str('') > float(-1) > bool(false) A==C : array() > float(NAN) > NULL(NULL) A==C : array() > float(NAN) > bool(false) A==C : array() > float(INF) > NULL(NULL) A==C : array() > float(INF) > bool(false) A==C : array() > float(-INF) > NULL(NULL) A==C : array() > float(-INF) > bool(false) A==C : array() > str('a') > NULL(NULL) A==C : array() > str('a') > bool(false) A==C : array() > int(1) > NULL(NULL) A==C : array() > int(1) > bool(false) A==C : array() > float(1) > NULL(NULL) A==C : array() > float(1) > bool(false) A==C : array() > str('1') > NULL(NULL) A==C : array() > str('1') > bool(false) A==C : array() > str('A') > NULL(NULL) A==C : array() > str('A') > bool(false) A==C : array() > str('0') > NULL(NULL) A==C : array() > int(-1) > NULL(NULL) A==C : array() > int(-1) > bool(false) A==C : array() > float(-1) > NULL(NULL) A==C : array() > float(-1) > bool(false) A==C : str('') > float(NAN) > bool(false) A==C : str('') > float(NAN) > NULL(NULL) A==C : str('A') > str('1') > int(0) A==C : str('A') > str('1') > float(0) A==C : int(0) > float(-INF) > NULL(NULL) A==C : int(0) > float(-INF) > bool(false) A==C : int(0) > int(-1) > NULL(NULL) A==C : int(0) > int(-1) > bool(false) A==C : int(0) > float(-1) > NULL(NULL) A==C : int(0) > float(-1) > bool(false) A==C : str('0') > float(NAN) > bool(false) A==C : str('0') > float(-INF) > bool(false) A==C : str('0') > int(-1) > bool(false) A==C : str('0') > float(-1) > bool(false) A==C : float(0) > float(-INF) > NULL(NULL) A==C : float(0) > float(-INF) > bool(false) A==C : float(0) > int(-1) > NULL(NULL) A==C : float(0) > int(-1) > bool(false) A==C : float(0) > float(-1) > NULL(NULL) A==C : float(0) > float(-1) > bool(false) A===C : str('0') > float(NAN) > str('0') A===C : str('') > float(NAN) > str('') A===C : str('a') > float(NAN) > str('a') A===C : str('1') > float(NAN) > str('1') A===C : str('A') > float(NAN) > str('A')
有趣的字符串比较:'女王' >
'国王' >
'杰克' >
'王牌'
还要检查一下PHP类型比较表,其中包含对:
isset()
和is_null()
if()
和empty()
==
与===
检查现在的PHP版本之间的差异。 http://3v4l.org/MAfDu。
在您对问题的第二部分进行更正之后,我将该部分的答案留给其他人。 我只想给你的问题的第一部分提供最令人惊讶的答案,即是否存在一个<
和>
运算符不灵敏的例子。 这里是。
这些都是true
:
"10" < "1a"
"1a" < "2"
"10" > "2"
如果<
传递( $a < $b
^ $b < $c
$a < $c
),最后一行将是
"10" < "2"
但PHP会尽量善良(?!),并在任何时候将字符串解释为数字。
事实证明,由于上述不灵敏性, 即使没有两个元素==
(并且没有元素是NAN), sort()
也可以根据它们的输入顺序将相同的元素排序为不同的顺序。 我在对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" )
链接地址: http://www.djcxy.com/p/1795.html