PHP Conference Japan 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

  • 布林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)
?>
新增註解

使用者貢獻的註解 12 則註解

991
Fred Koschara
11 年前
啊,是的,布林值 - 設定(TRUE)或未設定(FALSE)的位元值。既然我們有使用 int 變數作為布林值的 64 位元編譯器,則 *一個* 值為 FALSE(零),而 2**64-1 個值為 TRUE(其他所有值)。這個宇宙中似乎有更多真理,但 false 可以勝過任何為 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 運算子。
165
Mark Simon
7 年前
給 JavaScript 開發者的注意事項

在 PHP 中,空陣列會被視為 false,而在 JavaScript 中,空陣列會被視為 true。

在 PHP 中,你可以用 <?php if(!$stuff) ; ?> 來測試空陣列,但在 JavaScript 中這樣行不通,你必須測試陣列的長度。

這是因為在 JavaScript 中,陣列是一個物件,即使它沒有任何元素,它仍然被視為「某個東西」。

這只是一個經常同時使用這兩種語言的菜鳥開發者容易掉入的陷阱。
89
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;
}
10
asma dot gi dot 14 at gmail dot com
3 年前
當使用 echo false; 或 print false; 時,顯示會是空的,但當使用 echo 0; 或 print 0; 時,顯示會是 0。
57
terminatorul at gmail dot com
17 年前
請注意 "0.00" 會轉換為布林值 TRUE!

如果你的資料庫中有 DECIMAL 或 CURRENCY 類型的欄位,你可能會從資料庫收到這樣的字串。在這種情況下,你必須明確檢查該值是否 != 0,或明確將該值轉換為 int,而不僅僅是布林值。
23
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 表示失敗的情況下使用它。

第二個例子允許在一個 falsy 值被認為不足時使用替代值。以下範例:

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

是一種簡單地依序使用替代值的方法。(請注意使用 @ 運算子或接受未經過濾的輸入的常見警告...)

所有這些都預先假定了 0 在這種情況下也是不可接受的值。
46
Steve
16 年前
PHP 在 true 和 false 的值方面沒有違反任何規則。值 false 並不是數字 0 的常數,它是一個表示 false 的布林值。值 true 也不是 1 的常數,它是一個表示 true 的特殊布林值。當你列印它或在表達式中使用它時,它只會剛好轉換為整數 1,但它與整數值 1 的常數不同,你不應該將其用作常數。請注意頁面頂部所說的:

布林值表示真值。

它並不是說「布林值表示 0 或 1」。

符號常數確實是專門設計為始終且僅引用其常數值的。但布林值不是符號常數,它們是值。如果你嘗試將 2 個布林值相加,你的應用程式可能會有其他問題。
12
asma dot gi dot 14 at gmail dot com
3 年前
請記住,在 PHP 7 版本中,0 == 'whatever' 的結果為 true,而在 PHP 8 版本中則為 false。
37
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。
?>
33
artktec at gmail dot com
17 年前
請注意,你也可以使用 '!' 將數字轉換為布林值,就像它是明確的 (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 取反,然後你就可以正確轉換為 (bool) 了。

範例

<?php
$a
= !!array(); // 這會 === false; (符合預期)
/*
這可以取代 count($array) > 0 或 !(empty($array)) 來檢查陣列是否為空(你應該使用:!!$array)。
*/

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

$s = !!"testing"; // 這會 === true; (符合預期)
/*
注意:一般的轉換規則適用,因此 !!"0" 會評估為 === false
*/
?>
1
Anonymous
9 個月前
請注意 php 在處理 SQL 字串時,布林值的不完美之處。例如,包含在要發送到 MySQL 的字串中的「布林值」會被評估為空字串,結果如下:

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

會產生 mysql 錯誤 "You have an error ... near '(....,)"
3
marklgr
9 年前
對於那些想知道為什麼字串 "0" 是 falsy 的人,請考慮到許多輸入數據實際上是字串類型,即使它們在語義上是數字。

PHP 通常會嘗試將這些字串自動轉換為數字,因為程式設計師肯定是這樣想的 (試試 'echo "2"+3')。因此,PHP 設計人員決定以類似的方式處理 0 和 "0",也就是 falsy,以保持一致性並避免程式設計師以為自己獲得了一個數字,但剛好是零時會發生 truthy 的錯誤。
To Top