PHP 日本大会 2024

布尔值

bool 类型只有两个值,用于表示真值。它可以是 truefalse

语法

要指定 bool 字面量,请使用常量 truefalse。两者都区分大小写。

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

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

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

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

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

转换为布尔值

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

转换为 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 条注释

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

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

*正确的*设计应该是*任何*非空字符串都是 TRUE——句号,故事结束。相反,对于经验不足的程序员来说,又有一个需要注意的陷阱,并且在这个时候修复语言的设计错误无疑会破坏太多东西,以至于完全无法进行修正。

说到陷阱,考虑一下这个代码序列
<?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 运算符。
Mark Simon
7年前
JavaScript 开发者须知

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

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

这是因为在 JavaScript 中,数组是一个对象,即使它没有任何元素,它仍然被认为是某些东西。

这对那些经常同时使用这两种语言的年轻开发者来说是一个陷阱。
goran77 at fastmail dot fm
8年前
以下内容可能会为许多新开发者节省时间:注意不要将 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;
}
asma dot gi dot 14 at gmail dot com
3年前
使用 echo false; 或 print false; 时,显示将为空,但使用 echo 0; 或 print 0; 时,显示将为 0。
terminatorul at gmail dot com
17年前
注意“0.00”转换为布尔值 TRUE!

如果你的数据库中有 DECIMAL 或 CURRENCY 类型的列,你可能会从数据库中得到这样的字符串。在这种情况下,你必须显式检查该值是否 != 0,或者显式地将该值转换为 int,而不仅仅是转换为布尔值。
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 也是一个不可接受的值。
Steve
16年前
PHP 的 true 和 false 值没有违反任何规则。false 值不是数字 0 的常量,它是一个表示 false 的布尔值。true 值也不是 1 的常量,它是一个表示 true 的特殊布尔值。当你打印它或在表达式中使用它时,它碰巧转换为整数 1,但它与整数 1 的常量不同,你不应该将它用作常量。请注意页面顶部的说明

布尔值表达真值。

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

符号常量被专门设计为总是且仅引用其常数值,这是正确的。但是布尔值不是符号常量,它们是值。如果你试图添加 2 个布尔值,你的应用程序中可能还有其他问题。
asma dot gi dot 14 at gmail dot com
3年前
请记住,在 PHP 7 版本中 0 == 'whatever' 的结果为 true,而在 PHP 8 版本中为 false。
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。
?>
artktec at gmail dot com
17年前
请注意,你也可以使用 '!' 将数字转换为布尔值,就像它是显式的 (bool) 强制转换,然后取反一样。

因此你可以执行以下操作

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

非整数被强制转换,就像转换为 bool,然后取反一样。

示例

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

要像使用 (bool) 一样进行强制转换,你可以使用 "!!"(双 '!')对取反进行取反,然后你就可以转换为正确的 (bool) 了。

示例

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

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

$s = !!"testing"; // 这将 === true;(预期结果)
/*
注意:正常的类型转换规则适用,所以 !!"0" 将评估为 === false
*/
?>
匿名用户
9个月前
注意PHP和布尔值在处理SQL字符串时的缺陷。例如,包含在字符串中发送到MySQL的“布尔值”将被评估为空字符串,结果是

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

将生成一个MySQL错误“You have an error ... near '(....,)"
marklgr
9年前
对于那些想知道为什么字符串“0”为假值的人,请考虑大量输入数据实际上是字符串类型,即使它在语义上是数字的。

PHP经常尝试将这些字符串自动转换为数字,正如程序员预期的那样(尝试 'echo "2"+3')。因此,PHP设计者决定将0和“0”类似地对待,即假值,以保持一致性并避免程序员认为自己得到了一个真值数字,而当为零时却恰好为真值的错误。
To Top