2010-07-20 143 views
8

昨天,我發佈了一個answer問題,其中包括幾個(當時未知的)非常不好的代碼示例。從那以後,我一直在看我的PHP基礎知識,這讓我認爲這樣的代碼是可能的。這使我想到,我似乎無法找到一個問題的答案:這是一個很好的測試,看看是否設置了一個變量

如果我要檢查一個變量是否已經設置什麼,是一個有效的做法是不使用isset()另一幫手功能?這裏有一個「實例」:

if($not_set){ 
    //do something 
} else { 
    //do something else 
} 

不是...

if(isset($not_set)){ 
    //do something 
} else { 
    //do something else 
} 

從變量的名稱,你可以看到這個變量沒有設置。因此,條件將是錯誤的,並且else部分將運行。到目前爲止,我一直在使用這種做法,但在昨天的帖子後,我現在有一個暗示,這是錯誤的。

這就是爲什麼我認爲這是一個不錯的做法,省略了上面的isset()函數。從PHP手冊:

if結構是很多語言的最 重要的特性之一,包括 PHP。它允許 條件執行代碼 片段。 PHP設有如果 結構,它是類似於的 C:

如果(表達式)語句

正如在節約 表達式所描述的,表達被評估 其布爾值。如果表達式 的計算結果爲TRUE,則PHP將執行 語句,如果它的計算結果爲 FALSE - 它將忽略它。更多 有關將 設置爲FALSE的值的信息可在 「轉換爲布爾值」部分找到。

而且從 '轉換爲布爾值一節':

當轉換爲boolean ,以下值被認爲是 FALSE:

... *特殊類型NULL(包括未設置的變量)

爲什麼手冊不能說明未設置變量如果這是一個不好的做法,包括bles?如果未設置,它將轉換爲NULL,因此可以通過條件進行正確評估。使用isset()將會找到相同的結果,但會花費額外的週期來完成。

有人能告訴我我整個過程是否錯誤,爲什麼? (也許它有多糟?)

謝謝,所以你永遠不會失望。

編輯:謝謝大家(這很快)。我真的認爲迄今爲止所有的答案都很好,不知道應該選擇哪個答案......如果你沒有選中,我仍然會贊成:o)

+0

好吧null一樣好,你的做法*會*捕未設置變量,但它也會捕獲* *設置的其他變量。所以這不是一個真正的變量被設置的測試 – Gareth 2010-07-20 23:23:07

+0

另請參閱http://stackoverflow.com/questions/1960509/isset-and-empty-make-code-ugly – deceze 2010-07-20 23:25:37

+0

嘿欺騙!感謝昨天的一切 - 我的PHP理解有了巨大的飛躍(如你所見)。我在搜尋時沒有看到那個,但是我想的基本上是一樣的。 – Tim 2010-07-20 23:31:02

回答

6

,如果你的變量設置您將在運行到問題,但計算結果爲FALSE,如下所示:

  • 布爾FALSE本身
  • 的整數0(零)
  • 浮點數0。0(零)
  • 空字符串,和 串
  • 用零個元素
  • 零個構件 變量的對象(PHP陣列4只)
  • 特殊類型NULL(包括 尚未設定的變量)從空 標籤

從PHP手冊兩者創建

  • 的SimpleXML對象。

    基本上,使用isset()顯示您明確檢查變量是否存在並且不是NULL,而if語句的結構只檢查變量是否爲true。它更清晰,更不容易出錯。

  • +0

    'isset'檢查一個變量**是否存在**(*設置*),而不是'null'。 *設置*部分比* not'null' *部分重要得多。 – deceze 2010-07-21 00:11:28

    +0

    感謝您的澄清。編輯,以補充說明。 – jergason 2010-07-21 01:05:24

    12

    如果變量沒有設置,你會得到一個Notice。如果您使用isset(),則不會收到通知。所以從這一個錯誤報告點,使用isset()更好:)

    例子:

    error_reporting(E_ALL); 
    if($a) { 
        echo 'foo'; 
    } 
    

    Notice: Undefined variable: a in /Users/kling/test on line 5 
    

    error_reporting(E_ALL); 
    if(isset($a)) { 
        echo 'foo'; 
    } 
    

    不輸出任何東西。


    底線:如果代碼質量對您很重要,請使用isset()

    4

    這是一種常見做法,但並不好 - 您應該始終使用isset

    如果您的$not_set已設置,並且是值爲false的布爾,則您的「測試」將失敗!

    7

    這是好吧但不好的做法是使用if檢查設置變量。有兩個原因把我的頭頂部:

    1. 使用isset使意圖明確的 - 你正在檢查的變量是否被設置,而不是代替檢查條件是否爲真。
    2. if ($not_set)將在$not_set實際設置但等於布爾型false時評估爲false。
    +0

    +1提示意圖。 – 2010-07-20 23:22:51

    1

    isset作爲一名警衛,阻止您使用實際不存在的變量。
    if (isset($foo))if ($foo)並不意味着同樣的事情。 isset只是告訴你變量是否實際存在,如果可以使用它,它不會評估變量本身的值*

    因此,你通常應該使用這兩種模式中的一種:

    如果變量是肯定存在的,你只是要檢查它的值:

    if ($foo == 'bar') 
    

    如果變量可能會或可能不會存在,並且要檢查它的價值:如果你只是感興趣的一個變量設置

    if (isset($foo) && $foo == 'bar') 
    

    和評估爲true,即if ($foo),您可以使用empty

    if (isset($foo) && $foo) 
    // is the same as 
    if (!empty($foo)) 
    

    *它並檢查null,在不被設置在所有

    相關問題