(INT)假;在PHP为什么会这样?

时间:2013-06-04 03:47:41

标签: php codeigniter boolean logic

我正在审核合作伙伴的PHP代码,就像:

function query_db($form)
{
   $result = (int)false;    
   try{
    $sqlQuery = " SELECT id_user, id_access, name, email, status FROM users ";
    $sqlQuery .= " WHERE id_access> 0 ";
    if($form->get("limit")){
       $sqlQuery .= " LIMIT ".$form->get("start")." , ".$form->get("registry");
    }           
        $query = $this->db->query($sqlQuery);
    return $query;
   } catch (Exception $e) { 
    $result = (int)false;
   }
    return $result;
}

所以一开始他使用$result = (int)false;

我正在调查这条指令并发现:

  

只有当字符串为空或包含时,字符串才会转换为false   单个字符   0.如果它包含任何其他数据 - 甚至多个零 - 它将转换为true。

     

转换为数字或字符串时,布尔值变为1(如果是)   是,否则为0。

回到这个问题:

echo 0 + 1; // 1
echo false + 1; // 1
echo 0  > -1; // true
echo false  > -1; // false
echo (int)false > -1; // true

那么为什么他在世界上施展它而不是使用$result = 0;我的意思是,我不明白,也许它有更深层的含义而且我没有看到它。

这就是为什么我会问你的意见。

2 个答案:

答案 0 :(得分:4)

“为什么会这样”的答案是简单的答案:强制类型。

在你的引言中,你提到了答案:

  

当转换为数字或字符串时,如果布尔值为真,则布尔值变为1,否则为0。

通过类型强制,(int)false会将值转换为0。如果您拥有(int)!false,则为1

“为什么你的朋友会使用这个”的答案,这是你不得不问他的事情= P。在此代码块中执行此操作没有任何好处,可以替换为$result = 0,但对结果没有影响。

在回复评论时,0 通常为 false1true。但是,在提及成功和错误代码时,它高度依赖于您正在与之交互的系统。例如,在bash中,0是“成功”退出代码,1表示发生错误。

不回答相关
在您确切的代码块中,您实际上可以完全删除$result变量,因为如果查询失败,代码只会使用它来返回0;相反,你最后可以有return 0; - 如果你更喜欢直接处理布尔值,可以return false;

答案 1 :(得分:4)

我可以看到将false投射为int的唯一原因是相同的comparison operator

以下面的例子为例:

<?php
$x = false;
$y = (int)false;

if($x===false){ // validates
    echo 'Test x.1<br>';
}

if($x===FALSE){ // validates
    echo 'Test x.2<br>';
}

if($x===0){ // skips
    echo 'Test x.3<br>';
}

if($x==0){ // validates
    echo 'Test x.4<br>';
}

if(!$x){ // validates
    echo 'Test x.5<br>';
}

if(empty($x)){ // validates
    echo 'Test x.6<br>';
}

if($y===false){ // skips
    echo 'Test y.1<br>';
}

if($y===FALSE){ // skips
    echo 'Test y.2<br>';
}

if($y===0){ // validates
    echo 'Test y.3<br>';
}

if($y==0){ // validates
    echo 'Test y.4<br>';
}

if(!$y){ // validates
    echo 'Test y.5<br>';
}

if(empty($y)){ // validates
    echo 'Test y.6<br>';
}