2010-03-04 27 views
34

我想知道PHP如何在內部處理真/假比較。 我知道true被定義爲1,false被定義爲0. 當我做if("a"){ echo "true";}時,它回聲「true」。 PHP如何將「a」識別爲1?PHP中的真假工作如何?

+2

說「true被定義爲1而false被定義爲0」是過於簡單化的。 – 2010-03-04 20:33:05

+1

btw。猜這是什麼返回:「false」== true – 2016-11-04 20:59:20

回答

71

這涵蓋了PHP文件中爲booleanstype comparison tables

當轉換爲布爾型,下面的值被認爲是FALSE:

  • 布爾FALSE本身
  • 整數0(零)
  • 浮子0.0(零)
  • 空字符串,而字符串'0'
  • 一個數組與零個元素
  • 零個成員變量的對象(PHP 4只)
  • 特殊類型NULL(包括尚未設定的變量)

所有其它值都被認爲是TRUE從空標籤創建

  • SimpleXML的對象

  • +1

    實際上,有很多值會轉換爲false,包括空數組和null。或者你只是指字符串? – sidereal 2010-03-04 20:34:09

    +1

    @sidereal:我現在發佈了整個提取物。按刷新。 ;-) – 2010-03-04 20:34:59

    +0

    不是通常的慣例'除0之外的每一個其他值都被認爲是FALSE?如在linux shell中。我開始對程序員社區 – Blauhirn 2016-03-06 01:21:53

    5

    零爲假,非零爲真。

    在php中,您可以使用===運算符更明確地進行測試。

    if (0==false) 
        echo "works"; // will echo works 
    
    if (0===false) 
        echo "works"; // will not echo anything 
    
    +0

    爲什麼'0 === false'將不起作用? '0 === false'和'0 === FALSE'還有區別嗎? – JavaSa 2015-01-06 12:07:26

    +0

    '0 === false'和'0 === FALSE'之間沒有區別。這兩個錯誤評估的價值相同;對於函數名稱和語言關鍵字來說,PHP是令人討厭的,不區分大小寫。這兩個「工作」,但他們評估爲false,因爲'==='實際上做了一個依賴於類型的值檢查。 '=='允許類型之間的檢查;請參閱此線程上接受的答案,瞭解PHP如何確定哪些匹配爲false,哪些不匹配。 – kungphu 2016-05-09 03:44:44

    1

    PHP使用弱類型(它稱爲'類型雜耍'),這是一個壞主意(雖然這是另一次對話)。當您嘗試在一個需要布爾上下文使用一個變量,它會轉換無論您的變量爲布爾,根據這裏提供一些大多是任意性的規則: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

    +5

    「壞主意」純粹是主觀的:一旦你知道這是如何工作的,在我看來,這絕對不是問題;-) ;;並且轉換規則對我來說大多對我來說似乎不太合邏輯;-) – 2010-03-04 20:36:05

    +1

    不要讓我發佈一個關於弱點類型的想法有多糟糕的問題stackoverflow);)。考慮到PHP設法使基本的三段論失敗,因爲隱式類型轉換使得php的等式不是傳遞的: echo(「true」== true)。「\ n」; // true echo(true == 1)。「\ n」; // true echo(「true」== 1)。「\ n」; // false:P – sidereal 2010-03-04 21:12:24

    +1

    是啊......這對新玩家來說是一個(可能)非常危險的詭計,但不一定是個壞主意。我不打算在這裏捍衛代碼的健壯性,但有時這是一個很好的捷徑。另外,如果你在大規模工作方面做得很多,你可能會在大多數情況下使用平等方法。 – spronkey 2010-03-04 22:04:06

    0

    想到運營商爲一元函數的:is_false(type value)其中根據特定類型和值的確切實現返回true或false。考慮是否聲明通過語法糖隱含地調用這樣的函數。

    其他可能性是該類型具有cast操作符,該操作符隱式地將類型轉換爲另一種類型,在這種情況下,字符串轉換爲布爾值。

    PHP不公開這些細節,但C++允許運算符重載,這暴露了運算符實現的細節。

    3

    嚴格檢查最好的操作是

    if($foo === true){} 
    

    這樣的話,你真的檢查是否是真的,而不是1或只是簡單地設置。