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

zzz*_*Bov 16 php casting boolean

我正在阅读这个问题并看到这一行:

if ($a == $b) { return true } else { return false }
Run Code Online (Sandbox Code Playgroud)

它让我想知道,将一个未知类型的变量(可能是字符串,可能是int;谁知道?谁关心?)转换为布尔值的最佳方法是什么?

当然,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具有(dis)优势,E_NOTICE即在未定义变量时不抛出任何错误.如果您正在检查$_GET$_SESSION变量,这可能被认为是好的,对于大多数其他变量,我认为这可能被认为是错误的,因为它会隐藏变量未初始化的问题,应该初始化它.

我很好奇其他开发者是否有另一种做我不知道的事情的方法.

irc*_*ell 23

这两种方式是:

  1. 明确的演员:

    这是使用文字强制转换运算符显式转换变量的时候(bool).

    return (bool) $expression;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 隐式强制转换(使用运算符):

    这是从表达式推断出类型的地方.在PHP中,这包括逻辑运算符比较运算符,以及任何需要布尔值的函数/语言构造,例如ifwhile:

    return !!$expression;
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    return $expression == true;
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    return $a == $b;
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    return $a > 1;
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    if ($a)
    
    Run Code Online (Sandbox Code Playgroud)

所有方法都属于这两个类别之一.

我的建议是,如果你使用任何运营商(==,!=,>等),不要打扰铸造.但是,如果你只是返回一个变量,那么明确地投射......


Log*_*ley 13

我个人经常使用

(bool)$var;
Run Code Online (Sandbox Code Playgroud)

我认为这是将其转换为布尔值的最明确方式.来自其他语言的大多数人都明白这一点.另一个你忘记了的是

!!$var;
Run Code Online (Sandbox Code Playgroud)

我觉得有点难读.


Fel*_*ing 5

我在JavaScript中最常看到的内容:双重否定

return !!$var;
Run Code Online (Sandbox Code Playgroud)

说明:

!$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 }
Run Code Online (Sandbox Code Playgroud)

可以写成return ($a == $b)

我的本科生对此一无所知;这一定是有原因的。

更新2:

我会避免使用return $var && true。在PHP中,它将返回一个布尔值,但是在JavaScript或Python中,它将返回$var如果其值为true 的值。在这些语言中,此“技巧”是有意使用的,以实现某些效果。因此,对于(更多)熟悉这些语言的人来说,(没有文档或上下文)应该仅返回布尔值可能并不明显。