如何在PHP中最好地与0进行比较?

如何在PHP中最好地与0进行比较?,php,mysql,comparison,Php,Mysql,Comparison,在我正在处理的一段代码中,我需要从数据库中提取一个值,并检查它是否为0。最初,我是这样写的: if ($myVal == 0) { ... 但当我今天再次看到它时,我发现了一个bug: var_dump("foo" == 0); // bool(true) // and while we're here... var_dump(intval("foo")); // int(0) 由于该值来自数据库,通常意味着它将是一个字符串,因此我想我可以这样做: if ($myVal === "0")

在我正在处理的一段代码中,我需要从数据库中提取一个值,并检查它是否为
0
。最初,我是这样写的:

if ($myVal == 0) { ...
但当我今天再次看到它时,我发现了一个bug:

var_dump("foo" == 0);  // bool(true)

// and while we're here...
var_dump(intval("foo")); // int(0)
由于该值来自数据库,通常意味着它将是一个字符串,因此我想我可以这样做:

if ($myVal === "0")
但这似乎与直觉相反,因为我实际上想处理一个整数,这似乎表明我们正在处理字符串。(我希望这对您有意义。)此外,任何给定的DB访问器都会将值强制转换为相应的类型(给定字段类型),这也不应该是意外的


当值可以是字符串或int时,您使用什么方法检查值0?

目前我得到的最好结果是:

is_numeric($myVal) && $myVal == 0
尝试使用intval()将字符串强制转换为int

if( intval($myVal) == 0 )
简短版本:

if ("$myVal" === '0')

长版本:

if ($myVal === 0 || $myVal === '0')

如果从数据库返回的值是字符串,但原始数据类型是整数,那么您可能希望DAO(数据访问对象,或任何拉取数据的对象)将内容转换为您期望的数据类型。这样,查看值的PHP代码就是查看它所期望的数据类型

当然,问题是DB定义的数据类型与PHP定义的数据类型之间没有1-1对应关系。然而,在大多数情况下这并不是问题,因为对于我们通常使用的大多数类型,都有等价的类型:int、float、bool、string

结果是,在查询数据库的位置和检查这些值的位置之间,这些值应该转换为您期望的数据类型。我刚刚在一个包含int(10)和varchar(50)的mysql表上测试了mysql_fetch_object();PHP总是将这两个字段作为类型“string”拉入。因此,如果希望其中一个字段被视为int,请在对其执行任何操作之前将其转换为int。例如:

$rs = mysql_query("SELECT * FROM table");
while ($row = mysql_fetch_object($rs)) {
    $RealRow->id = (int)$row->id;
    $RealRow->name = $row->name;
    // etc.
}

// ... later ...

if ($RealRow->status == 0) {
    // do something
}

查询和RealRow内容应该在类/方法中,以便对其进行封装;这样,从
获取数据的代码的任何部分都将始终获得$RealRow对象,该对象将所有内容都设置为正确的数据类型。当然,如果您更改了数据类型,这需要手动编辑DAO来处理强制转换;还可以查询数据库以获取每个字段的类型(带有“ShowColumns FROM table”),并自动将字段转换为正确的数据类型。

我认为您应该使用

if ($myVal == 0)
我认为没有必要担心$myVal是否是“foo”。你自己说过这个值只会是一个数字

if( ('integer' === gettype($is_anonymous) && $is_anonymous === 0 )
    ||
    ('string' === gettype($is_anonymous) && $is_anonymous === '0')    
 ) {
    echo 'matches';
}

换句话说,如果您曾经体验过$myVal是“foo”,那么错误并不是“foo”==0,而是$myVal是“foo”,当它应该是一个数字时。

(intval(“这不应该等于零”)==0)是真的,将字符串转换为int将导致0,除非字符串以数字开头。字符串“foo”转换为0,字符串“35foo”转换为35。哦,这很聪明-我不会想到用另一种方式转换它!我的猜测是长版本实际上是更快的版本是一个快速的比较,因为它不进行类型转换。@Jm:你可能是对的。打字更烦人。:)我刚刚做了一些基准测试:就运行时间而言,您的strval()方法与我提出的is_数值函数(0.31s进行100000次迭代)相当。但是,使用“$myVal”==0方法大约快6-7倍,而长版本快10倍以上!我真的很惊讶“$myVal”比strval()慢得多。我本以为会是另一种情况。有趣的结果。这个条件总是返回false,因为正如您在问题中所说的,db中的值是作为字符串返回的$myVal是一个字符串,比较将在此处停止。在进行比较之前,您应该将值强制转换为整数。实际上,对于数值字符串,bgy,is_numeric()将返回true。请参见“从myTable显示完整列”命令,它是确定每个字段的数据类型的更简单的方法。但是,有时,对于给定的情况,这种抽象级别可能会超出范围。我更希望“SHOW[FULL]COLUMNS”实际将数据类型按基本类型、显示空间、unsigned等分解为单独的字段,以便更易于编程访问。现在您必须手动解析输出的“Type”字段。。。尽管我相信有人已经为此准备了一个库。+1看起来很基本,但考虑到PHP的类型转换,这是一个令人惊讶的有趣问题。虽然这段代码可能会回答这个问题,但提供关于为什么和/或如何回答这个问题的附加上下文可以提高其长期价值。
if( ('integer' === gettype($is_anonymous) && $is_anonymous === 0 )
    ||
    ('string' === gettype($is_anonymous) && $is_anonymous === '0')    
 ) {
    echo 'matches';
}