我正在审核合作伙伴的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;
我的意思是,我不明白,也许它有更深层的含义而且我没有看到它。
这就是为什么我会问你的意见。
答案 0 :(得分:4)
“为什么会这样”的答案是简单的答案:强制类型。
在你的引言中,你提到了答案:
当转换为数字或字符串时,如果布尔值为真,则布尔值变为1,否则为0。
通过类型强制,(int)false
会将值转换为0
。如果您拥有(int)!false
,则为1
。
“为什么你的朋友会使用这个”的答案,这是你不得不问他的事情= P。在此代码块中执行此操作没有任何好处,可以替换为$result = 0
,但对结果没有影响。
在回复评论时,0
通常为 false
而1
为true
。但是,在提及成功和错误代码时,它高度依赖于您正在与之交互的系统。例如,在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>';
}