非常不合逻辑的php值比较

roo*_*ook 12 php

我偶然发现了一些非常奇怪的PHP代码.有人可以解释为什么会这样吗?*****奖励积分*****如果你能告诉我为什么这是有用的.

<?php
if(0=='a'){
    print ord(0)." should NEVER equal ".ord('a')."<br>";
}
if(false==0){
       print "false==0<br>";
}
if('a'==false){
       print "a==false<br>";
}
?>
Run Code Online (Sandbox Code Playgroud)

结果输出:

48 should NEVER equal 97
false==0
Run Code Online (Sandbox Code Playgroud)

Jam*_*eod 33

在PHP中,'a'不是ASCII字符a,而是字符串a.在数值上下文中,它等于0.例如,intval('a')结果值为0.

这很有用,因为PHP主要用于处理文本,有人可能想尝试测试(123 =='123'),这是真的.并且考虑到单引号(或双引号)中的数字被视为数字,没有数字值的字符串被视为除0以外的任何值都没有意义.

哦,是的,还有一件事.布尔上下文中的'a'为true,而不是false.我相信这使得某些类型的文本处理更加自然,但老实说,我不能在这么晚的时候想到一个例子.


dec*_*eze 7

这是弱/动态类型语言的基本原则,称为类型杂耍.在某些情况下,类型将转换为其他类型.将字符串与数字进行比较时,字符串将被转换为数字.将任何内容与布尔值进行比较时,该值将被强制转换为布尔值.

规则 对于 每个 类型为如何将其铸造成另一种类型或者它如何比较于其他类型.'a'恰好在转换为数字0时转换为(唯一的逻辑选择,真的).要避免此类型转换,请使用等号运算符进行测试==,但不要使用标识运算符进行测试 ===.

正如詹姆斯所指出的那样,这很有用,因为PHP会使用真正数字的字符串进行大量处理.例如,即使值是数字,HTML表单也只提交字符串.它还允许一些非常简洁的代码,例如:

$result = someOperation();
if (!$result) {
    // $result may be null, false, 0, '' or array(),
    // all of which we're not interested in
    error();
}
Run Code Online (Sandbox Code Playgroud)

这也意味着你必须非常小心在什么情况下检查什么,因为一个值可能会意外地转换成其他东西.诚然,'a' == 0本身真的是类型杂耍的陷阱,而不是有用.这是你需要小心和测试的情况之一if (is_numeric($var) && $var == 0).