2011-02-04 90 views
13

我讀this question,看到這一行:在php中將變量轉換爲布爾值的最佳方式是什麼?

if ($a == $b) { return true } else { return false } 

它使我想知道,什麼是投未知類型的變量的最佳方法(可能是字符串,可以是int,誰知道誰關心?)到布爾?

當然,if ($var) { return true; } else { return false; }會訣竅,但我認爲return $var ? true : false;可能會更好。

對於這個問題:

  • return $var && true
  • return $var || false
  • return !empty($var)

都可能會更好,但有投爲bool一個最佳方式是什麼?更重要的是,最好的是什麼?

編輯澄清:

這是沒有用的是中投爲布爾的方式的綜合列表的意圖寫的。我的問題是明確鑄造。之前我瞭解empty我用isset($var) && $var,因爲它會阻止對未聲明的變量所引發的錯誤。現在我使用!empty($var),因爲輸入的速度更快。

!empty具有不發生任何E_NOTICE錯誤時(變量)未定義的(dis)優勢。如果你正在檢查$_GET$_SESSION變量,對於大多數其他變量,我認爲這可能被認爲是不好的,因爲它會隱藏變量未初始化的地方,它應該已經初始化。

我很好奇其他開發人員是否有另一種做法,我並不知道 。

+0

我會感興趣爲什麼你認爲有一個最好的辦法?例如,我不認爲有*最好的代碼*。當然,你可以在某種程度上找到客觀的標準,但是它一度變得主觀。 – 2011-02-04 01:02:47

+0

@Felix Kling,這是一個很主觀的問題,我不想使用* best *,但是我發現很難想出一些很好的指標來判斷像布爾鑄造這樣簡單的事情:最快嗎?幾乎不重要。打字最短?可讀性? – zzzzBov 2011-02-04 16:52:21

+0

出於興趣,我[跑了一個快速測試](https://eval.in/431853)看看哪個更快,並且使用`(bool)`明確地類型化它一直更快。 – Styphon 2015-09-11 14:34:36

回答

20

的兩種方式是:

  1. 明確的轉換:

    這是當你使用文字轉換運算符(bool)明確投下變量。

    return (bool) $expression; 
    
  2. 隱式轉換(使用運算符):

    這其中類型由表達式推斷。在PHP中,這包括logical operatorscomparison operators,並期望一個布爾如ifwhile任何功能/語言構造:

    return !!$expression; 
    

    return $expression == true; 
    

    return $a == $b; 
    

    return $a > 1; 
    

    if ($a) 
    

所有方法將落入這兩個類別中的一個。

我的建議是,如果你使用任何運營商(==,!=,>等),不要打擾鑄造。但如果你只是返回一個變量,然後明確地投...

4

我所看到的最經常的JavaScript:雙重否定

return !!$var; 

說明:

!$var評估$varopposite boolean value(如果$var沒有一個布爾值,它是converted to boolean first (type conversion))和第二個!再次反轉此值,導致布爾值,$var也會評估。

它是最好的嗎?這取決於你的標準。如前所述,這可能是很難理解(雖然它沒有什麼特別的),但它肯定是最短的版本;)

它可能還取決於其值認爲是truefalse。這些值在默認情況下評估爲false

  • 布爾值FALSE
  • 整數0(零)
  • 浮子0.0(零)
  • 空字符串,並且字符串「0 「
  • 具有零個元素的數組
  • 零個成員變量的對象(PHP 4只)
  • 的特殊類型NULL(包括尚未設定的變量)的空標籤
  • 創建
  • 的SimpleXML對象

更新:

我想一般人可以說,每一個避免代碼明確地返回truefalse比較好。通過顯式轉換或隱式轉換。當然,明確的(根據定義)應該更容易理解。

代碼如return $a ? true : false是多餘的。尤其是

if ($a == $b) { return true } else { return false } 

可以寫成return ($a == $b)

爲什麼在我的大學生中,這一定是被忽視的原因;)。

UPDATE2:

我將避免表達如return $var && true。在PHP中,它會返回一個布爾值,但例如在JavaScript或Python中,如果它的計算結果爲true,它將返回值$var。而在這些語言中,這個「技巧」有意用來達到某些效果。所以對於熟悉這些語言的人(更多),它可能並不明顯(沒有文檔或上下文)只返回一個布爾值。

2

將一個未知類型的變量(可能是字符串,可能是int;誰知道?誰在乎?)轉換爲布爾類型的最佳方式是什麼?

return (bool)$var; 
13

我個人一直使用

(bool)$var; 

我覺得這是它轉換爲一個布爾值的最明確的方式。大多數來自其他語言的人都瞭解這一點。另一個你忘了你是

!!$var; 

我發現一個有點難以閱讀。

相關問題