在php中将变量转换为布尔类型的最佳方法是什么?

17

我在阅读这篇问题时看到了这行代码:

if ($a == $b) { return true } else { return false }

我开始想,怎么样才是将一个未知类型的变量(可能是字符串,也可能是整数;谁知道呢?谁在乎呢?)转换为布尔值的最佳方式?

当然,if ($var) { return true; } else { return false; } 可以实现,但我认为 return $var ? true : false; 可能更好。

同理:

  • return $var && true
  • return $var || false
  • return !empty($var)

这些都可能更好,但有没有一种最佳的强制转换布尔值的方法?更重要的是,什么让它成为最佳方式?

编辑以澄清:

这不是旨在成为强制转换为布尔值的全面列表。我的问题是关于显式类型转换的。在了解empty之前,我使用 isset($var) && $var 来防止出现未声明变量时抛出错误。现在我使用 !empty($var),因为它打字速度更快。

!empty 的(缺点)优点是在未定义变量时不会抛出任何E_NOTICE错误。如果您正在检查 $_GET$_SESSION 变量,这可能是一个好的选择,对于大多数其他变量而言,它可能被认为是不好的,因为它会隐藏未初始化但应该已经初始化的变量的问题。

我想知道其他开发人员是否有另一种做事情的方式,我之前并不了解。


我很感兴趣知道你为什么认为有一种最好的方式?例如,我并不认为存在“最佳代码”。当然,你可以找到客观标准在某种程度上进行评判,但在某个时候它变得主观。 - Felix Kling
@Felix Kling,毫无疑问这是一个主观问题,我不想使用“最好”的词,但我很难提出好的指标来评判像布尔强制转换这样简单的东西:速度最快?几乎没有影响。打字最短?可读性? - zzzzBov
出于兴趣我进行了一个快速测试,以查看哪个更快,并且使用(bool)进行显式类型转换一直比较快。 - Styphon
5个回答

24
两种方式如下:
1. 显式转换:即使用显式转换运算符 (bool) 明确地进行变量类型转换。
2. 隐式转换:当您尝试将一种类型的变量分配给另一种类型的变量时,可以发生隐式转换。
return (bool) $expression;
  • 隐式转换(使用运算符):

    这是指从表达式中推断出类型。在 PHP 中,包括逻辑运算符比较运算符,以及任何期望布尔值的函数/语言结构,例如ifwhile

    return !!$expression;
    
    或。
    return $expression == true;
    
    或者
    return $a == $b;
    
    或者
    return $a > 1;
    
    或者
    if ($a)
    
  • 所有方法都属于这两个类别。

    我的建议是,如果你使用任何运算符(==!=>等),不要费力地转换类型。但如果你只是返回一个变量,则需要明确地进行类型转换...


    应该是 return $a > 0; 而不是 return $a > 1; 吗? - po0l
    如果我看到 return !!$expression;,我可能会认为有人犯了一个错误而删除双重否定。对于那些可能认为这是一种“酷”的类型转换方式的人,请记住这一点。 - david2278

    14

    我个人总是使用

    (bool)$var;
    

    我认为这是将其转换为布尔值的最清晰的方法。来自其他编程语言的大多数人都能理解。你在列表中忘记了另一个方法。

    !!$var;
    

    我发现那个有点难以阅读。


    5
    我经常在JavaScript中看到的是双重否定。
    return !!$var;
    

    解释:

    !$var 会将 $var 转换为 相反的布尔值(如果 $var 不是布尔值,则会先进行布尔类型转换),第二个 ! 再次取反,得到与 $var 相同的布尔值。

    这是最佳方法吗?这取决于您的标准。正如已经提到的,它可能更难理解(尽管它并不特别),但它绝对是最短的版本 ;)

    这也可能取决于您认为哪些值为 truefalse。默认情况下,这些值会被评估为 false

    • 布尔值 FALSE 本身
    • 整数 0 (零)
    • 浮点数 0.0 (零)
    • 空字符串以及字符串 "0"
    • 零元素的数组
    • 零成员变量的对象 (仅适用于 PHP 4)
    • 特殊类型 NULL (包括未设置的变量)
    • 从空标签创建的 SimpleXML 对象

    更新:

    总的来说,可以说避免显式返回 truefalse 的代码更好。通过显式转换或隐式类型转换都可以实现这一点。当然,显式的方式(根据定义)应该更容易理解。

    例如,具有 return $a ? true : false 这样的代码是冗余的。特别是

    if ($a == $b) { return true } else { return false }
    

    这段代码可以简写为return ($a == $b)

    大学时期可能有不赞同的原因 ;)

    更新2:

    我建议避免使用诸如return $var && true这样的表达式。在PHP中,它将返回一个布尔值,但是在JavaScript或Python中,如果$var的值为真,则会返回其值。而在这些语言中,这种“技巧”被用于实现某些效果。因此对于(更)熟悉这些语言的人来说,如果没有文档或上下文,可能不会明确返回布尔值。


    这怎么有助于PHP呢?我只是在寻找更多的描述。 - Jared Farrish
    @Felix - 为什么这个有效?那就是我一直在寻找的描述。 - Jared Farrish
    @Jared Farrish:嗯,你看了我的更新答案吗?抱歉,我无法解释得更好了... - Felix Kling
    1
    值得一提的是:在JavaScript中,双重否定很有用,因为它没有明确转换为布尔原始类型的方法。唯一的其他转换方式是使用new Boolean(value);然而,由于它创建了一个对象,在与其他布尔原始类型进行严格比较时将会失败。在PHP或其他支持它的语言中,我认为应该总是使用强制转换而不是强制转换,以便更清晰地表达意思。!!$val没有什么不清楚的,但(bool)$val更加清晰明了。 - Justin Johnson
    @Justin Johnson:我同意你的观点。 - Felix Kling
    显示剩余2条评论

    2
    什么是将未知类型的变量(可能是字符串,也可能是整数;谁知道呢?谁在乎呢?)转换为布尔值的最佳方法?
    return (bool)$var;
    

    0

    那么转换成布尔类型怎么样? - zneak
    没错,我最初没有注意到,因为我通常会使用(int)进行强制转换。请看编辑后的内容。 - Jared Farrish
    在PHP中,除了布尔值false或零以外的所有内容都会在if语句中被视为true。 - sevenseacat
    @Jared Farrish:它将自动执行。如果我没记错的话,这是PHP核心中的一堆优化,因此在数百万次运行中,if($var)将比if((bool)$var)快得多。 - zerkms
    哦,好的,我明白你的意思了。有趣的问题。 :) - Jared Farrish
    @zerkms - 我现在有点困惑。我是对的/错的/无所谓吗? - Jared Farrish

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接