背后的PHP类型比较背后的哲学
所以在php网站上有这个页面显示比较不同值的结果:
http://php.net/manual/en/types.comparisons.php
这是一个有用的参考,但我宁愿不必每次访问此页面以确保我正在进行类型比较。 所以我的问题是
在PHP的类型比较逻辑背后是否存在某种潜在的哲学/推理?
例如,我可以看到,对于松散的比较:
但从试图建立模式开始就变得有点多毛。
对于直接转换为布尔值,这是它的工作原理。
然后这些规则用于比较相同类型的变量:
对于不同类型的变量,上面列表中较高的类型将转换为比较低的类型。
===
和!==
运算符在比较之前不会进行转换,但您应该注意,如果对象是相同的实例,则对象只有===
。
奇怪的是数组,它们是===
如果它们具有相同的顺序定义的键和值。
$a = array("a"=>1, "b"=>2);
$b = array("b"=>2, "a"=>1);
$a == $b; // true
$a === $b; // false
而empty()
等价于!(bool)$var
例外
Array
__toString
方法的对象转换为字符串会导致一个致命错误。 ArrayAccess
接口也是如此) 对于严格的===
比较,逻辑很简单:每个价值实体仅等于自身,所以TRUE === TRUE
, "1" === "1"
,但是"1" !== 1
等等
当谈到==
比较时, 不幸的是没有经验法则,也没有明确的逻辑 。 这可能是因为运营商的各种形式由不同的程序员实施,没有中央设计决策。 我能做的最好的就是提供这张图表来打印并粘贴在显示器上:
Grap的关键是:当且仅当A
和B
两种类型直接通过上图中的一条线连接时, A == B
才会为TRUE
。 例如, array() == NULL
是TRUE
因为array()
和NULL
是直接连接的,而array() == 0
是FALSE
因为没有连线。
以红色标出的线条是棘手的(非明显的)平等 。
我忽略了每个实体都等于自身(例如"1" == "1"
等),但这应该很容易记住。
最后,我想解释为什么"php" == 0
是TRUE
(非空,非数字字符串等于0
):因为PHP在比较之前将"php"
转换为数字,并且由于它不是数字它默认为0
,并使测试为TRUE
。
有趣的事实:在这种关系中没有分区! 如果允许传递闭包,你可以很容易地说真是假和假是真的,用四个简单的PHP语句破坏千年哲学:D
如果价值包含某些东西,那么它可以说是true
。 例如, 1
, 1.123
, array("value")
等,均应视为true
。
如果该值可以说是空的或无效的(即缺少某些东西),那么它被视为false
。 例如, 0
, 0.0
, array()
等等。
这种关于变量的思考方式对PHP并不特别。 许多其他语言以相同或相似的方式进行操作。 例如Perl,C和Javascript,仅举几例。
链接地址: http://www.djcxy.com/p/58513.html