背后的PHP类型比较背后的哲学

所以在php网站上有这个页面显示比较不同值的结果:

http://php.net/manual/en/types.comparisons.php

这是一个有用的参考,但我宁愿不必每次访问此页面以确保我正在进行类型比较。 所以我的问题是

在PHP的类型比较逻辑背后是否存在某种潜在的哲学/推理?

例如,我可以看到,对于松散的比较:

  • 1,-1,“1”和“-1”可以视为TRUE,0和“0”可以视为FALSE;
  • 将数字的字符串值与数字本身的值比较为TRUE;
  • 但从试图建立模式开始就变得有点多毛。


    对于直接转换为布尔值,这是它的工作原理。

  • 所有长度> 0的字符串都是真的
  • 所有非0数字都是真的
  • 所有非空数组都是真的
  • 所有对象都是真实的
  • 然后这些规则用于比较相同类型的变量:

  • 如果对象的属性相同,则对象是等价的
  • 如果数组的键和元素相等,则数组是相等的
  • 如果它们产生相同的输出,则字符串是等效的
  • 如果数字在数学上相同,则它们是等效的
  • 如果布尔值具有相同的值,则它们是等价的。
  • 对于不同类型的变量,上面列表中较高的类型将转换为比较低的类型。

    ===!==运算符在比较之前不会进行转换,但您应该注意,如果对象是相同的实例,则对象只有===

    奇怪的是数组,它们是===如果它们具有相同的顺序定义的键和值。

    $a = array("a"=>1, "b"=>2);
    $b = array("b"=>2, "a"=>1);
    
    $a == $b; // true
    $a === $b; // false
    

    empty()等价于!(bool)$var

    例外

  • 将一个数组转换为一个字符串将触发一个通知,并将其作为文本Array
  • 将没有__toString方法的对象转换为字符串会导致一个致命错误。
  • 对象不会隐式地转换为数组,所以无论何时将一个对象与一个数组进行比较,它都会产生一个错误( UPDATE证实即使对象实现了ArrayAccess接口也是如此)

  • 对于严格的===比较,逻辑很简单:每个价值实体仅等于自身,所以TRUE === TRUE"1" === "1" ,但是"1" !== 1等等

    当谈到==比较时, 不幸的是没有经验法则,也没有明确的逻辑 。 这可能是因为运营商的各种形式由不同的程序员实施,没有中央设计决策。 我能做的最好的就是提供这张图表来打印并粘贴在显示器上:

    PHP等式图

    Grap的关键是:当且仅当AB两种类型直接通过上图中的一条线连接时, A == B才会为TRUE 。 例如, array() == NULLTRUE因为array()NULL是直接连接的,而array() == 0FALSE因为没有连线。

    以红色标出的线条是棘手的(非明显的)平等

    我忽略了每个实体都等于自身(例如"1" == "1"等),但这应该很容易记住。

    最后,我想解释为什么"php" == 0TRUE (非空,非数字字符串等于0 ):因为PHP在比较之前将"php"转换为数字,并且由于它不是数字它默认为0 ,并使测试为TRUE

    有趣的事实:在这种关系中没有分区! 如果允许传递闭包,你可以很容易地说真是假和假是真的,用四个简单的PHP语句破坏千年哲学:D


    如果价值包含某些东西,那么它可以说是true 。 例如, 11.123array("value")等,均应视为true

    如果该值可以说是空的或无效的(即缺少某些东西),那么它被视为false 。 例如, 00.0array()等等。

    这种关于变量的思考方式对PHP并不特别。 许多其他语言以相同或相似的方式进行操作。 例如Perl,C和Javascript,仅举几例。

    链接地址: http://www.djcxy.com/p/58513.html

    上一篇: Underlying philosophy behind php type comparisons

    下一篇: php string number concatenation messed up