(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通常false1true。然而,当提到成功和错误代码时,它高度依赖于您正在与之交互的系统。例如,在bash 中,0 是“成功”退出代码,1 表示发生了错误。

与答案无关: 在您的确切代码块中,您实际上可以完全删除 $result 变量,因为如果查询失败,代码只使用它返回 0 ;相反,您可以只在末尾添加return 0; - 如果您更喜欢直接处理布尔值,则可以使用return false;

【讨论】:

是的,我正要问他,但我没有想到什么... @cMinor 大多数情况下,这样的事情是由“边写边写”引起的;他可能已经想出了一个为占位符创建常量变量的计划,例如 ERRORSUCCESS 并且忘记编写它们/将它们放置到位。或者,谁知道呢,也许只是他的一个傻瓜=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++ [重复]

c语言int k=10; for(;!k;k--)printf("%d",k--)为啥无答案

PHP 中计算(int)(0.58*100)等于57的问题

位运算符的问题,&不能进行int,float运算。为啥?

为啥在这种情况下可空类型不相等?