略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: Boolean 布尔类型

2024-11-14

Boolean 布尔类型

这是最简单的类型。bool 表达了真值,可以为 truefalse

语法

要指定一个 bool,使用常量 truefalse。两个都不区分大小写。

<?php
$foo 
True// 设置 $foo 为 TRUE
?>

通常运算符所返回的 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) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 bool 参数时,该值会被自动转换。

参见类型转换的判别

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

  • 布尔false 本身
  • 整型值 0(零)
  • 浮点型值 0.0(零)-0.0(零)
  • 字符串,以及字符串 "0"
  • 不包括任何元素的数组
  • 特殊类型 NULL(包括尚未赋值的变量)
  • 由无属性的空元素创建 SimpleXML 对象,也就是既没有子节点也没有属性的元素。

所有其它值都被认为是 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)
?>
add a noteadd a note

User Contributed Notes 27 notes

up
892
Fred Koschara
9 years ago
Ah, yes, booleans - bit values that are either set (TRUE) or not set (FALSE).  Now that we have 64 bit compilers using an int variable for booleans, there is *one* value which is FALSE (zero) and 2**64-1 values that are TRUE (everything else).  It appears there's a lot more truth in this universe, but false can trump anything that's true...

PHP's handling of strings as booleans is *almost* correct - an empty string is FALSE, and a non-empty string is TRUE - with one exception:  A string containing a single zero is considered FALSE.  Why?  If *any* non-empty strings are going to be considered FALSE, why *only* a single zero?  Why not "FALSE" (preferably case insensitive), or "0.0" (with how many decimal places), or "NO" (again, case insensitive), or ... ?

The *correct* design would have been that *any* non-empty string is TRUE - period, end of story.  Instead, there's another GOTCHA for the less-than-completely-experienced programmer to watch out for, and fixing the language's design error at this late date would undoubtedly break so many things that the correction is completely out of the question.

Speaking of GOTCHAs, consider this code sequence:
<?php
$x
=TRUE;
$y=FALSE;
$z=$y OR $x;
?>

Is $z TRUE or FALSE?

In this case, $z will be FALSE because the above code is equivalent to <?php ($z=$y) OR $x ?> rather than <?php $z=($y OR $x) ?> as might be expected - because the OR operator has lower precedence than assignment operators.

On the other hand, after this code sequence:
<?php
$x
=TRUE;
$y=FALSE;
$z=$y || $x;
?>

$z will be TRUE, as expected, because the || operator has higher precedence than assignment:  The code is equivalent to $z=($y OR $x).

This is why you should NEVER use the OR operator without explicit parentheses around the expression where it is being used.
up
124
Mark Simon
5 years ago
Note for JavaScript developers:

In PHP, an empty array evaluates to false, while in JavaScript an empty array evaluates to true.

In PHP, you can test an empty array as <?php if(!$stuff) ; ?> which won’t work in JavaScript where you need to test the array length.

This is because in JavaScript, an array is an object, and, while it may not have any elements, it is still regarded as something.

Just a trap for young players who routinely work in both langauges.
up
13
asma dot gi dot 14 at gmail dot com
1 year ago
Please keep in mind that the result of  0 == 'whatever'  is true in PHP Version 7 and false in PHP version 8.
up
153
admin at eexit dot fr
13 years ago
Beware of certain control behavior with boolean and non boolean values :

<?php
// Consider that the 0 could by any parameters including itself
var_dump(0 == 1); // false
var_dump(0 == (bool)'all'); // false
var_dump(0 == 'all'); // TRUE, take care
var_dump(0 === 'all'); // false

// To avoid this behavior, you need to cast your parameter as string like that :
var_dump((string)0 == 'all'); // false
?>
up
73
goran77 at fastmail dot fm
5 years ago
Just something that will probably save time for many new developers: beware of interpreting FALSE and TRUE as integers.
For example, a small function for deleting elements of an array may give unexpected results if you are not fully aware of what happens:

<?php

function remove_element($element, $array)
{
  
//array_search returns index of element, and FALSE if nothing is found
  
$index = array_search($element, $array);
   unset (
$array[$index]);
   return
$array;
}

// this will remove element 'A'
$array = ['A', 'B', 'C'];
$array = remove_element('A', $array);

//but any non-existent element will also remove 'A'!
$array = ['A', 'B', 'C'];
$array = remove_element('X', $array);
?>

The problem here is, although array_search returns boolean false when it doesn't find specific element, it is interpreted as zero when used as array index.

So you have to explicitly check for FALSE, otherwise you'll probably loose some elements:

<?php
//correct
function remove_element($element, $array)
{
  
$index = array_search($element, $array);
   if (
$index !== FALSE)
   {
       unset (
$array[$index]);
   }
   return
$array;
}
up
54
terminatorul at gmail dot com
15 years ago
Beware that "0.00" converts to boolean TRUE !

You may get such a string from your database, if you have columns of type DECIMAL or CURRENCY. In such cases you have to explicitly check if the value is != 0 or to explicitly convert the value to int also, not only to boolean.
up
40
Steve
14 years ago
PHP does not break any rules with the values of true and false.  The value false is not a constant for the number 0, it is a boolean value that indicates false.  The value true is also not a constant for 1, it is a special boolean value that indicates true.  It just happens to cast to integer 1 when you print it or use it in an expression, but it's not the same as a constant for the integer value 1 and you shouldn't use it as one.  Notice what it says at the top of the page:

A boolean expresses a truth value.

It does not say "a boolean expresses a 0 or 1".

It's true that symbolic constants are specifically designed to always and only reference their constant value.  But booleans are not symbolic constants, they are values.  If you're trying to add 2 boolean values you might have other problems in your application.
up
37
artktec at gmail dot com
14 years ago
Note you can also use the '!' to convert a number to a boolean, as if it was an explicit (bool) cast then NOT.

So you can do something like:

<?php
$t
= !0; // This will === true;
$f = !1; // This will === false;
?>

And non-integers are casted as if to bool, then NOT.

Example:

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

To cast as if using a (bool) you can NOT the NOT with "!!" (double '!'), then you are casting to the correct (bool).

Example:

<?php
$a
= !!array();   // This will === false; (as expected)
/*
This can be a substitute for count($array) > 0 or !(empty($array)) to check to see if an array is empty or not  (you would use: !!$array).
*/

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

$s = !!"testing"; // This will === true; (as expected)
/*
Note: normal casting rules apply so a !!"0" would evaluate to an === false
*/
?>
up
11
Mark Simon
5 years ago
Note on the OR operator.

A previous comment notes the trap you can fall into with this operator. This is about its usefulness.

Both OR and || are short-circuited operators, which means they will stop evaluating once they reach a TRUE value. By design, OR is evaluated after assignment (while || is evaluated before assignment).

This has the benefit of allowing some simple constructions such as:

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

The first example, often seen in PERL, could have been written as <?php if(!$stuff=getStuff()) die('oops'); ?> but reads a little more naturally. I have often used it in situations where null or false indicate failure.

The second allows for an alternative value if a falsy one is regarded as insufficient. The following example

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

is a simple way sequencing alternative values. (Note the usual warnings about using the @ operator or accepting unfiltered input …)

All this presupposes that 0 is also an unacceptable value in the situation.
up
29
Wackzingo
14 years ago
It is correct that TRUE or FALSE should not be used as constants for the numbers 0 and 1. But there may be times when it might be helpful to see the value of the Boolean as a 1 or 0. Here's how to do it.

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

echo
$var1; // Will display the number 1

echo $var2; //Will display nothing

/* To get it to display the number 0 for
a false value you have to typecast it: */

echo (int)$var2; //This will display the number 0 for false.
?>
up
5
marklgr
6 years ago
For those wondering why the string "0" is falsy, consider that a good deal of input data is actually string-typed, even when it is semantically numeral.

PHP often tries to autoconvert these strings to numeral, as the programmer certainly intended (try 'echo "2"+3'). Consequently, PHP designers decided to treat 0 and "0" similarly, ie. falsy, for consistency and to avoid bugs where the programmer believes he got a true numeral that would happen to be truthy when zero.
up
2
richie dot hayward at gmail dot com
6 years ago
Actually from a complete noob point of view 0 resulting in false makes sense as many languages as I have been taught consider the value 1 as true and the value 0 as false a simple boolean value.

So lets says you think you set a variable to 0 and some how or another through your code this value has implicitly become and string instead of a int or boolean. Should PHP now consider it to evaluate to false. I wouldn't think so but hey I'm a PHP noob so perhaps I'm missing why you would ever want a "0" string to evaluate to true.
up
0
asma dot gi dot 14 at gmail dot com
1 year ago
when using echo false; or print false; the display will be empty but when using echo 0; or print 0; the display will be 0.
up
4
geza at turigeza dot com
9 years ago
// someKey is a boolean true
$array = array('someKey'=>true);

// in the following 'false' string gets converted to a boolean true
if($array['someKey'] != 'false')
    echo 'The value of someKey is '.$array['someKey'];

As a result the above will output nothing :)

if($array['someKey'] == 'false')
    echo 'The value of someKey is '.$array['someKey'];

And the above will output
The value of someKey is 1

In short true == 'false' is true.
up
1
fyrye at torntech dot com
12 years ago
Since I haven't seen it posted.
Here is a function that you can use if you have a need to force strict boolean values.
Hopefully this will save someone some time from searching for similar.
<?php
function strictBool($val=false){
    return
is_integer($val)?false:$val == 1;
}
?>

Simply put, it verifies that the value passed is (bool)true otherwise it's false.

Examples:
__________________________________
<?php
$myBool
= strictBool(true);
var_dump($myBool);
//returns (bool)true

$myar = array(0 => true);
$myBool = strictBool($myar[0]);
var_dump($myBool);
//returns (bool)true

$myBool = strictBool("hello");
var_dump($myBool);
//returns (bool)false

$myBool = strictBool(false);
var_dump($myBool);
//returns (bool)false

$myBool = strictBool(array(0 => "hello"));
var_dump($myBool);
//returns (bool)false

$myBool = strictBool(1);
var_dump($myBool);
//returns (bool)false

$myBool = strictBool();
var_dump($myBool);
//returns (bool)false
?>
up
-1
mike652638 at qq dot com
11 months ago
// For those newbies who may also have puzzles as following:
  $bool_val = (bool)true;
  echo $bool_val;
  // Codes above prints 1

  $bool_val2 = (bool)false;
  echo $bool_val2;
  // Codes above prints nothing (literally nothing)

  // But how to print false or 0 (instead of nothing) for the falsy value or condition then ?

  // Solution1:
  $bool_exp1 = (bool)false;
  echo $bool_exp1 ? 'true' : 'false';
  // Codes above prints false;

  // Solution2:
  $bool_exp2 = (bool)false;
  echo json_encode($bool_exp2);
  // Codes above prints false;

  // Solution3:
  $bool_exp3 = (bool)false;
  echo var_export($bool_exp3);
  // Codes above prints false;

  // Soluton4:
  $bool_exp4 = (bool)false;
  echo (int)$bool_exp4;
  // Codes above prints 0;

  // Solution5:
  $bool_exp5 = (bool)false;
  var_dump($bool_exp5);
  // Codes above prints bool(false);
up
-4
oscar at oveas dot com
11 years ago
Dunno if someone else posted this solution already, but if not, here's a useful and function to convert strings to strict booleans.
Note this one only checks for string and defaults to the PHP (boolean) cast where e.g. -1 returns true, but you easily add some elseifs for other datatypes.

<?php
function toStrictBoolean ($_val, $_trueValues = array('yes', 'y', 'true'), $_forceLowercase = true)
{
    if (
is_string($_val)) {
        return (
in_array(
             (
$_forceLowercase?strtolower($_val):$_val)
            ,
$_trueValues)
        );
    } else {
        return (boolean)
$_val;
    }
}
?>
up
-5
emanuelemicciulla[at]gmail[dot]com
7 years ago
A lot of people apparently looking for this:
<?php
$strictBool
= filter_var($stringBool, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
if(
$boolFanOvr === null) { /*manage error*/};
?>

it's TRUE for "true" "True" "TRUE" "Yes" "1" and so on.
FALSE for "false" "0" "no" and so on.
it's NULL if string doesn't represent a valid boolean.
up
-5
Symbol
13 years ago
Just a side note, doesn't really matters, the reason -1 is true and not false is because boolean type is treated as unsigned, so -1 would be for example, if it's unsigned int32 translate to hex: 0xFFFFFFFF and back to decimal: 4294967295 which is non-zero. there isn't really a "negative boolean". it's a binary thing. :o (since it used to be a bit and then there was only 0 and 1 as an option)
up
-16
mercusmaximus at yahoo dot com
12 years ago
Note that the comparison: (false == 0) evaluates to true and so will any value you set to false as well (without casting).
up
-4
Anonymous
1 year ago
What will be the output you think if we add echo and print both at a time..

<?php

$a
= 5;

print print
$a// prints out: 51     inner 'print' prints the value of $a, then                                                                                                                                     // outer 'print' returns  the boolean true about print $a

echo print $a// prints out: 51     inner 'print' prints the value of $a, then
// outer 'echo' returns  the boolean true about print $a

echo echo $a;    // syntax error.. echo doesn't return

print echo $a;     // syntax error.. echo doesn't return

?>
up
-23
wbcarts at juno dot com
13 years ago
CODING PRACTICE...

Much of the confusion about booleans (but not limited to booleans) is the fact that PHP itself automatically makes a type cast or conversion for you, which may NOT be what you want or expect. In most cases, it's better to provide functions that give your program the exact behavior you want.
<?php

function boolNumber($bValue = false) {                      // returns integer
 
return ($bValue ? 1 : 0);
}

function
boolString($bValue = false) {                      // returns string
 
return ($bValue ? 'true' : 'false');
}

$a = true;                                                  // boolean value
echo 'boolean $a AS string = ' . boolString($a) . '<br>';   // boolean as a string
echo 'boolean $a AS number = ' . boolNumber($a) . '<br>';   // boolean as a number
echo '<br>';

$b = (45 > 90);                                             // boolean value
echo 'boolean $b AS string = ' . boolString($b) . '<br>';   // boolean as a string
echo 'boolean $b AS number = ' . boolNumber($b) . '<br>';   // boolean as a number
echo '<br>';

$c = boolNumber(10 > 8) + boolNumber(!(5 > 10));            // adding booleans
echo 'integer $c = ' . $c .'<br>';

?>
Results in the following being printed...

boolean $a AS string = true
boolean $a AS number = 1

boolean $b AS string = false
boolean $b AS number = 0

integer $c = 2

In other words, if we know what we want out of our program, we can create functions to accommodate. Here, we just wanted 'manual control' over numbers and strings, so that PHP doesn't confuse us.
up
-14
shady dot elmashad at feng dot bu dot edu dot eg
4 years ago
First, this is very useful.
Second, I want to ask about the example, how the following:
var_dump((bool) "false");   // bool(true)

Thanks in advance
http://www.bu.edu.eg/staff/shadyelmashad3
up
-28
ledadu at gmail dot com
11 years ago
Function to sort array by elements and count of element (before php 5.3) (not use Lambda Functions, and Closures)

<?php

//-----------------------------

function arraySortByElements($array2sort,$sortField,$order,$iscount=false) {
    
       
$functionString='
        if ('
.($iscount?'true':'false').'){
              if(count($a["'
.$sortField.'"]) > count($b["'.$sortField.'"])) return 1*'.$order.';
            if(count($a["'
.$sortField.'"]) < count($b["'.$sortField.'"])) return -1*'.$order.';
          }else{
            if($a["'
.$sortField.'"] > $b["'.$sortField.'"]) return 1*'.$order.';
            if($a["'
.$sortField.'"] < $b["'.$sortField.'"]) return -1*'.$order.';
          }
        return 0;'
;
       
    
usort($array2sort, create_function('$a,$b',$functionString));
     return
$array2sort;
}

//-----------------------------

//init Array for testing :
$testArray = array(
          array(
'name' => 'Lenny', 'note' => 5, 'listId' => array(654,987,32165)),
          array(
'name' => 'Olivier', 'note' =>3, 'listId' => array(2)),
          array(
'name' => 'Gregory', 'note' => 1, 'listId' => array(45,58)),
          array(
'name' => 'Clement', 'note' => 2, 'listId' => array(584,587,741,14781,147))
        );

//sorted Arrays :
       
$testArrayByNameASC = arraySortByElements($testArray,'name',1);
       
$testArrayByNoteDESC = arraySortByElements($testArray,'note',-1);
       
$testArrayByCountlistIdDESC = arraySortByElements($testArray,'listId',-1,true);

?>
up
-32
Anonymous
14 years ago
Note that the symbolic constants TRUE and FALSE are treated differently.  I was told that this is a feature, not a bug.

echo false ;
echo (false) ;
echo false+false ;
echo (false+false) ;
echo intval(false) ;
echo '"'.false.'"' ;

echo true ;
echo (true) ;
echo true+true ;
echo (true+true) ;
echo intval(true) ;
echo '"'.true.'"' ;

should produce

00000"0"11221"1"

but instead produces

000""11221"1"

In other words, the only way to output the underlying zero or use it in a string is to use 'false+false' or pass it through intval().  No such tricks are required to get at the 1 that underlies true.

The whole idea of symbolic constants is that the underlying value *always* replaces them during translation, and thus anywhere you would otherwise have to use some obscure "magic number" such as 191, you can use a symbolic constant that makes sense, such as TOTAL_NATIONS. 

Exactly what php gets out of breaking this rule was not explained to me.
up
-9
sumon dot pdk dot bd at gmail dot com
2 years ago
When compare zero (0) with string it's return true by type jugling. When compare with TRUE with also the same string it's also returning true.
But when comparing zero (0) with True then it's returning FALSE.

echo 0 == 'This is a string'; // 1
echo TRUE == 'This is a string'; //1
echo 0 == TRUE ; // FALSE
up
-48
den
8 years ago
Casting bools to string is not working as maybe expected:

echo 'true as string gives [' . (string) true . "] not [true].\n";
echo 'false as string gives [' . (string) false . "] not [false].\n";

Output:

true as string gives [1] not [true].
false as string gives [] not [false].

This helps around that behavior:

true ? 'true' : 'false'

官方地址:https://www.php.net/manual/en/language.types.boolean.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3