我正在阅读this question并看到这一行:
if ($a == $b) { return true } else { return false }
这让我想知道,将一个未知类型的变量(可能是字符串,可能是int;谁知道?谁关心?)转换为布尔值的最佳方法是什么?
当然,if ($var) { return true; } else { return false; }
可以解决问题,但我认为return $var ? true : false;
可能更好。
就此而言:
return $var && true
return $var || false
return !empty($var)
都可能更好,但是有一种最好的方式可以投射到bool吗?更重要的是,最好的是什么?
编辑以澄清:
这不是为了成为强制转换为布尔值的方法的全面列表而编写的。我的问题是特别是关于显式投射。在我了解empty
之前,我使用了isset($var) && $var
,因为它可以防止错误被抛弃在未声明的变量上。现在我使用!empty($var)
,因为输入速度更快。
!empty
具有(dis)优势,即在未定义变量时不会抛出任何E_NOTICE
错误。如果你检查$_GET
或$_SESSION
变量,这可能被认为是好的,对于大多数其他变量,我认为这可能被认为是错误的,因为它会隐藏变量未初始化的问题。已初始化。
我很好奇其他开发者是否有其他方式做我没有做过的事情 知道的。
答案 0 :(得分:22)
这两种方式是:
明确演员:
这是使用文字强制转换运算符(bool)
显式转换变量的时候。
return (bool) $expression;
隐式演员(使用运算符):
这是从表达式推断出类型的地方。在PHP中,这包括logical operators和comparison operators,以及任何需要布尔值的函数/语言构造,例如if
和while
:
return !!$expression;
或
return $expression == true;
或
return $a == $b;
或
return $a > 1;
或
if ($a)
所有方法都属于这两个类别之一。
我的建议是,如果您使用任何运算符(==
,!=
,>
等),请不要费心去投票。但是如果你只是返回一个变量,那么明确地转换......
答案 1 :(得分:13)
我个人总是使用
(bool)$var;
我认为这是将其强制转换为布尔值的最明确方法。来自其他语言的大多数人都明白这一点。另一个你忘了你的是
!!$var;
我觉得有点难读。
答案 2 :(得分:5)
我在JavaScript中经常看到的内容:双重否定
return !!$var;
<强>解释
!$var
评估$var
到opposite boolean value(如果$var
不是布尔值,它是converted to boolean first (type conversion)),第二个!
再次反转此值,导致布尔值,$var
也会评估。
这是最好的吗?这取决于您的标准。如前所述,它可能更难理解(尽管它没什么特别的)但它绝对是最短的版本;)
它也可能取决于您认为true
和false
的值。默认情况下,这些值会评估为false
:
- 布尔值FALSE本身
- 整数0(零)
- 浮点数0.0(零)
- 空字符串,字符串“0”
- 包含零元素的数组
- 一个零成员变量的对象(仅限PHP 4)
- 特殊类型NULL(包括未设置的变量)
- 从空标签创建的SimpleXML对象
<强>更新
我认为通常可以说,避免明确返回true
或false
的每个代码都更好。通过显式转换或隐式类型转换。当然,明确(按定义)应该更容易理解。
拥有return $a ? true : false
之类的代码是多余的。特别是
if ($a == $b) { return true } else { return false }
可以写成return ($a == $b)
。
必须有一个原因,为什么这在我的本科生中不受欢迎;)。
<强> UPDATE2:
我会避免像return $var && true
这样的表达。在PHP中,它将返回一个布尔值,但例如在JavaScript或Python中,如果计算结果为true,它将返回$var
的值。在这些语言中,这种“技巧”是故意用于实现某些效果的。因此,对于熟悉这些语言的人(更多),可能并不明显(没有文档或上下文)只返回一个布尔值。
答案 3 :(得分:2)
将未知类型的变量(可能是字符串,可能是int;谁知道?谁关心?)转换为布尔值的最佳方法是什么?
return (bool)$var;
答案 4 :(得分:0)
你可以施放:
if ((bool)$string)
http://php.net/manual/en/language.types.type-juggling.php
注意,在PHP中,因为0 == false,你需要使用===比较器来进行类型比较,再加上值比较。