(int)假的;在php中为啥会这样?
Posted
技术标签:
【中文标题】(int)假的;在php中为啥会这样?【英文标题】:(int)false; in php why would it be?(int)假的;在php中为什么会这样? 【发布时间】:2013-05-30 08:32:56 【问题描述】:我正在审查一个合作伙伴的 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. 如果它包含任何其他数据——甚至是多个零——它会被转换为 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 是 false 还是 -1...所以他让语言为他做这件事。 但不是标准使用 0 为假,1 为真,-1 是错误,或者我错了 是的,你错了,布尔值只有 2 个值:FALSE (0) / TRUE(不是 0)。 -1 或其他是 INTEGER 值的人。要知道函数究竟返回了什么,你应该仔细阅读文档而不是猜测。 @cMinor 我不是说他的做法是对的,我只是想猜测什么会迫使某人做如此荒谬的事情 好吧,我的意思是当不使用布尔值时,我的意思是整数,(0 false),(1 true),(-1 error),我理解布尔值只能是真或假 【参考方案1】:“为什么会这样”的答案很简单:类型强制。
在你的引文中,你提到了答案:
当转换为数字或字符串时,布尔值如果为真则为 1,否则为 0。
通过类型强制,(int)false
将值转换为0
。如果你有(int)!false
,那就是1
。
“为什么你的朋友会使用这个”的答案,这是你必须问他的问题 =P。在此代码块中执行此操作没有任何好处,可以用 $result = 0
替换,对结果的影响为零。
在回复评论时,0
通常false
和1
是true
。然而,当提到成功和错误代码时,它高度依赖于您正在与之交互的系统。例如,在bash
中,0
是“成功”退出代码,1
表示发生了错误。
与答案无关:
在您的确切代码块中,您实际上可以完全删除 $result
变量,因为如果查询失败,代码只使用它返回 0
;相反,您可以只在末尾添加return 0;
- 如果您更喜欢直接处理布尔值,则可以使用return false;
。
【讨论】:
是的,我正要问他,但我没有想到什么... @cMinor 大多数情况下,这样的事情是由“边写边写”引起的;他可能已经想出了一个为占位符创建常量变量的计划,例如ERROR
或 SUCCESS
并且忘记编写它们/将它们放置到位。或者,谁知道呢,也许只是他的一个傻瓜=P【参考方案2】:
我能看到将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>';
【讨论】:
以上是关于(int)假的;在php中为啥会这样?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 main 前面有一个 int ,为啥我的教授会排除它? [复制]
为啥从 int 到 const char* 的转换会破坏 C++ [重复]