3

我正在审查合作伙伴的 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;

我正在调查这个指令,发现:

只有当字符串为空或包含单个字符 0 时,字符串才会被转换为 false。如果它包含任何其他数据(甚至多个零),它会被转换为 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;我的意思是,我不明白,也许它有更深层次的含义,我没有看到这个。

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

4

2 回答 2

4

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

在您的引文中,您提到了答案:

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

通过类型强制,(int)false将值转换为0. 如果你有(int)!false,那就是1

“为什么你的朋友会使用这个”的答案,这是你必须问他的问题 =P。在这个代码块中这样做没有任何好处,可以用$result = 0对结果的零影响来代替。

在回复评论时,0通常 false1true。然而,当提到成功和错误代码时,它高度依赖于您正在与之交互的系统。例如, inbash0一个“成功的”退出代码,1意味着发生了错误。

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

于 2013-06-04T03:57:21.873 回答
4

false我能看到转换为 an的唯一原因int是相同的比较运算符

以下面的例子为例:

<?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>';
}
于 2013-06-04T04:00:08.590 回答