布尔值

bool 类型只有两个值,用于表示真值。它可以是 **true** 或 **false**。

语法

要指定 bool 文字,请使用常量 **true** 或 **false**。两者都区分大小写。

<?php
$foo
= True; // 将值 TRUE 赋给 $foo
?>

通常,返回 bool 值的 运算符 的结果将传递给 控制结构

<?php
// == 是一个运算符,它测试
// 相等性并返回布尔值
if ($action == "show_version") {
echo
"The version is 1.23";
}

// 这不是必需的...
if ($show_separators == TRUE) {
echo
"<hr>\n";
}

// ...因为可以用完全相同的含义使用它:
if ($show_separators) {
echo
"<hr>\n";
}
?>

转换为布尔值

要显式地将值转换为 bool,请使用 (bool) 转换。通常这不是必需的,因为当在逻辑上下文中使用值时,它将自动被解释为 bool 类型的 value。有关更多信息,请参阅 类型转换 页面。

在转换为 bool 时,以下值被认为是 **false**

所有其他值都被认为是 **true**(包括 资源 和 **NAN**)。

警告

-1 被认为是 **true**,就像任何其他非零(无论是负数还是正数)数字一样!

<?php
var_dump
((bool) ""); // bool(false)
var_dump((bool) "0"); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
?>
添加说明

用户贡献的说明 12 条说明

970
Fred Koschara
11 年前
啊,是的,布尔值——位值,要么设置 (TRUE),要么未设置 (FALSE)。现在我们有使用 int 变量作为布尔值的 64 位编译器,只有一个值是 FALSE(零),而 2**64-1 个值是 TRUE(所有其他值)。看来这个宇宙中有很多真理,但虚假可以战胜任何真理……

PHP 处理字符串作为布尔值的方式几乎是正确的——空字符串是 FALSE,非空字符串是 TRUE——只有一个例外:包含单个零的字符串被认为是 FALSE。为什么?如果 *任何* 非空字符串都被认为是 FALSE,为什么 *只有* 单个零?为什么不能是 "FALSE"(最好不区分大小写),或者 "0.0"(有多少位小数),或者 "NO"(同样不区分大小写),或者……?

*正确* 的设计应该是 *任何* 非空字符串都是 TRUE——就这么简单。相反,对于经验不足的程序员来说,还有另一个 GOTCHA 需要注意,并且在这么晚的时候修复语言设计错误无疑会破坏很多东西,以至于修正完全不可能。

说到 GOTCHA,请考虑以下代码序列
<?php
$x
=TRUE;
$y=FALSE;
$z=$y OR $x;
?>

$z 是 TRUE 还是 FALSE?

在这种情况下,$z 将是 FALSE,因为以上代码等效于 <?php ($z=$y) OR $x ?> 而不是 <?php $z=($y OR $x) ?>,正如预期的那样——因为 OR 运算符的优先级低于赋值运算符。

另一方面,在以下代码序列之后
<?php
$x
=TRUE;
$y=FALSE;
$z=$y || $x;
?>

$z 将是 TRUE,正如预期的那样,因为 || 运算符的优先级高于赋值:代码等效于 $z=($y OR $x)。

这就是为什么你永远不应该在没有显式地用括号括起来的情况下使用 OR 运算符。
161
Mark Simon
7 年前
针对 JavaScript 开发者的说明

在 PHP 中,空数组评估为 false,而在 JavaScript 中,空数组评估为 true。

在 PHP 中,您可以像 <?php if(!$stuff) ; ?> 一样测试空数组,这在 JavaScript 中不起作用,在 JavaScript 中您需要测试数组的长度。

这是因为在 JavaScript 中,数组是对象,虽然它可能没有任何元素,但它仍然被认为是某物。

对于那些经常使用这两种语言的年轻玩家来说,这是一个陷阱。
4
匿名
5 个月前
请注意,php 和布尔值在处理 SQL 字符串时的缺陷。例如,包含在发送到 MySQL 的字符串中的“布尔值”将评估为空字符串,因此结果是

$TF = false;
$SQL = "INSERT INTO ... (...., booleanTF) VALUES (...., $TF)"

将生成一个 mysql 错误“您有一个错误……靠近 '(....,)”
87
goran77 at fastmail dot fm
7 年前
对于很多新手开发者来说,以下建议可以节省时间:注意不要将 FALSE 和 TRUE 误解为整数。
例如,一个用于删除数组元素的小函数,如果对其中发生的情况没有完全了解,可能会产生意外结果。

<?php

function remove_element($element, $array)
{
//array_search 返回元素的索引,如果未找到则返回 FALSE
$index = array_search($element, $array);
unset (
$array[$index]);
return
$array;
}

// 这将删除元素 'A'
$array = ['A', 'B', 'C'];
$array = remove_element('A', $array);

// 但任何不存在的元素也将删除 'A'!
$array = ['A', 'B', 'C'];
$array = remove_element('X', $array);
?>

这里的问题是,虽然 array_search 在找不到特定元素时返回布尔值 false,但当用作数组索引时,它会被解释为零。

因此,您必须显式检查 FALSE,否则您可能会丢失一些元素。

<?php
// 正确
function remove_element($element, $array)
{
$index = array_search($element, $array);
if (
$index !== FALSE)
{
unset (
$array[$index]);
}
return
$array;
}
57
terminatorul at gmail dot com
17 年前
注意 "0.00" 会转换为布尔值 TRUE!

如果您有 DECIMAL 或 CURRENCY 类型的列,您可能会从数据库中获得这样的字符串。在这种情况下,您必须显式检查值是否 != 0,或者显式将值转换为 int,而不仅仅是转换为布尔值。
8
asma dot gi dot 14 at gmail dot com
3 年前
使用 echo false; 或 print false; 时,显示将为空,但使用 echo 0; 或 print 0; 时,显示将为 0。
16
asma dot gi dot 14 at gmail dot com
3 年前
请记住,在 PHP 版本 7 中,0 == 'whatever' 的结果为 true,而在 PHP 版本 8 中则为 false。
48
Steve
16 年前
PHP 在 true 和 false 的值方面并没有违反任何规则。false 值不是数字 0 的常量,它是一个表示 false 的布尔值。true 值也不是 1 的常量,它是一个表示 true 的特殊布尔值。它恰好在您打印或在表达式中使用它时转换为整数 1,但它与整数 1 的常量不同,您不应该将其用作常量。请注意页面顶部的说明

布尔值表示真值。

它并没有说“布尔值表示 0 或 1”。

确实,符号常量专门设计为始终且仅引用其常数值。但布尔值不是符号常量,它们是值。如果您尝试添加两个布尔值,则应用程序中可能存在其他问题。
21
Mark Simon
7 年前
关于 OR 运算符的说明。

之前的一条评论指出了您在使用此运算符时可能会遇到的陷阱。这是关于它的用途。

OR 和 || 都是短路运算符,这意味着它们将在达到 TRUE 值时停止评估。根据设计,OR 在赋值后进行评估(而 || 在赋值前进行评估)。

这使得一些简单的构造成为可能,例如

<?php
$stuff
=getStuff() or die('oops');
$thing=something() or $thing=whatever();
?>

第一个示例通常在 PERL 中看到,可以写成 <?php if(!$stuff=getStuff()) die('oops'); ?> 但读起来更自然一些。我经常在将 null 或 false 视为失败的情况中使用它。

第二个示例允许在将假值视为不足时提供备用值。以下示例

<?php
$page
=@$_GET['page'] or $page=@$_COOKIE['page'] or $page=1;
?>

是一种简单的对备用值进行排序的方法。(注意使用 @ 运算符或接受未过滤输入的常见警告……)

所有这些都假设在这种情况中 0 也是不可接受的值。
36
Wackzingo
16 年前
TRUE 或 FALSE 不应该用作数字 0 和 1 的常量是正确的。但有时将布尔值的值视为 1 或 0 可能会很有帮助。以下是操作方法。

<?php
$var1
= TRUE;
$var2 = FALSE;

echo
$var1; // 将显示数字 1

echo $var2; // 将不显示任何内容

/* 要让 false 值显示数字 0,
必须对其进行类型转换: */

echo (int)$var2; // 这将为 false 显示数字 0。
?>
32
artktec at gmail dot com
16 年前
注意,您也可以使用 '!' 将数字转换为布尔值,就像使用显式 (bool) 转换然后 NOT 一样。

因此,您可以执行类似的操作

<?php
$t
= !0; // 这将 === true;
$f = !1; // 这将 === false;
?>

非整数将转换为布尔值,然后 NOT。

示例

<?php
$a
= !array(); // 这将 === true;
$a = !array('a'); // 这将 === false;
$s = !""; // 这将 === true;
$s = !"hello"; // 这将 === false;
?>

要像使用 (bool) 一样进行转换,可以使用 “!!”(双!)对 NOT 进行 NOT,然后您将转换为正确的 (bool)。

示例

<?php
$a
= !!array(); // 这将 === false; (预期结果)
/*
这可以替代 count($array) > 0 或 !(empty($array)) 来检查数组是否为空(您将使用:!!$array)。
*/

$status = (!!$array ? 'complete' : 'incomplete');

$s = !!"testing"; // 这将 === true; (预期结果)
/*
注意:将应用正常的转换规则,因此 !!"0" 将评估为 === false
*/
?>
4
marklgr
8 年前
对于那些想知道为什么字符串 "0" 为假值的人,请记住,许多输入数据实际上是字符串类型的,即使在语义上是数字。

PHP 通常尝试将这些字符串自动转换为数字,因为程序员肯定有意这样做(尝试 'echo "2"+3')。因此,PHP 设计人员决定将 0 和 "0" 视为相似的,即假值,以保持一致性,并避免程序员认为他得到了一个真正的数字,而这个数字恰好是零时的真值。
To Top