本文共 1315 字,大约阅读时间需要 4 分钟。
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)
为了构成部分阶数,必须是反射性的,反对称和传递性的:
> 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(示例与==相同)。
> Extra:PHP的< =运算符不是总的,即$ a< = $ b和$ b< = $ a都可以是false:
var_dump(new stdClass <= new DateTime); // bool(false)
var_dump(new DateTime <= new stdClass); // bool(false)
为了构成严格的部分顺序,必须是非自反性,不对称和传递性的:
> PHP的
> PHP的
> PHP的
var_dump(-INF < 0); // bool(true)
var_dump(0 < TRUE); // bool(true)
var_dump(-INF < TRUE); // bool(false)
>额外:PHP的
>额外:PHP的
var_dump(INF < []); // bool(true)
var_dump([] < new stdClass); // bool(true)
var_dump(new stdClass < INF); // bool(true)
注意:上面的例子抛出“stdClass类的对象无法转换为double”的通知。
作为最后一点,我想指出,有两个平等PHP,PHP保证(不像几乎一切)。这两个总是保持,只是因为编译器把一个减少到另一个:
($a > $b) == ($b < $a)
($a >= $b) == ($b <= $a)
转载地址:https://blog.csdn.net/weixin_31068553/article/details/115738375 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!