2010-02-17 63 views
7

考慮到:試驗在變量NULL值,該值可能無法設置

  • 如果一個變量被設置,並且如果所述變量不是NULL
  • is_null()函數拋出一個警告的isset()構建體返回TRUE沒有設置

有沒有一種方法來測試一個變量是否存在,無論它是否爲NULL,沒有使用@操作符來抑制通知?


編輯

你的第一個回覆

在一起,我一直在想這件事,我得到的結論是,檢查get_defined_vars()是一個變量集之間進行區分的唯一途徑NULL和一個未設置的變量。 PHP似乎沒有多大的區別:

<?php 

$exists_and_is_null = NULL; 

// All these are TRUE 

@var_dump(is_null($exists_and_is_null)); 
@var_dump(is_null($does_not_exist)); 

@var_dump($exists_and_is_null===NULL); 
@var_dump($does_not_exist===NULL); 

@var_dump(gettype($exists_and_is_null)=='NULL'); 
@var_dump(gettype($does_not_exist)=='NULL'); 

?> 
+0

幾次閱讀這個問題......他在尋找什麼是不明顯的,比第一次出現更難。 –

回答

5
$result = array_key_exists('varname', get_defined_vars()); 
+0

可能不是最優的,但機智 –

-2
if (isset($var) && (is_null($var)) { 
    print "\$var is null"; 
} 

這應該做的伎倆。

+0

當$ var爲NULL時,此條件爲FALSE –

+0

使用'print'$ var爲null''時,不需要轉義$,因爲不會評估單引號。它仍然是一個字符串值 – Kim

0

正如你已經發現了,你不能:

  • 依靠isset,因爲它的變量是null返回false
  • 使用$not_exists===null,因爲它會發出通知。


但是你可能能夠使用的combinaison:


例如:

$exists_and_null = null; 
$exists_and_not_null = 10; 

$defined_vars = get_defined_vars(); 

// true 
var_dump(array_key_exists('exists_and_null', $defined_vars) 
    && $defined_vars['exists_and_null']===null); 

// false 
var_dump(array_key_exists('exists_and_not_null', $defined_vars) 
    && $defined_vars['exists_and_not_null']===null); 

// false 
var_dump(array_key_exists('not_exists', $defined_vars) 
    && $defined_vars['not_exists']===null); 


有兩點要注意:

  • 在第一種情況中,變量存在=>有在返回的列表中的條目get_defined_vars,因此條件的第二部分被評估爲
    • 和條件的兩個部分是true
  • 在第二種情況下,該變量存在太多,但爲空
    • 這意味着條件的第一部分是true,但第二個是因此整個表達式是false
  • 在第三種情況下,變量不存在,
    • 這意味着條件的第一部分是false
    • 和條件的第二部分不評估 - 這意味着它不會發出通知。

但是請注意,這可能不是一個好主意,如果你在乎的表演:isset是一個語言結構,是快 - 同時呼籲get_defined_vars可能是慢得多^^

+0

優秀的分析。實際上,使用@看起來是最好的選擇。 –

+2

謝謝:-) ;;;實際上,我認爲通常不需要在*「不存在」*和*「爲空」*之間做出區別*:在大多數情況下,使用'isset'應該沒問題。 –

0

我用自己創建的函數來輕鬆檢查,記住它會觸發PHP警告(我開發時只監視E_ERROR)。

function isNullOrEmpty($arg) 
    { 
     if (!is_array($arg)) 
     { 
      $arg = array($arg); 
     } 

     foreach ($arg as $key => $value) 
     { 
      if($value == null || trim($value) == "") 
      { 
       return true; 
      } 
     } 
     return false; 
    } 
+0

這段代碼可以使用正確的array_filter(),is_null等來清理,但我不打算在沒有測試的情況下這樣做,所以我將在這裏作爲一個工作示例。 – TravisO

0

我會在這裏爭辯說,任何需要這種比較的代碼都會得到它的語義錯誤; NULL 這是一種語言中未設置的值,它沒有直接區分兩者的方式。

+0

(例如)有一個未設定的$ phone_number(用戶沒有提供他的號碼)和在你的代碼中有一個類似$ fone_number的拼寫錯誤是有區別的。我發現在處理這兩種情況方面沒有任何不妥,恕我直言,這是非常奇特的,而PHP的差異很小。只要看看SQL:具有NULL值的行與不存在的行不同。 –

+1

當然有。然而,試着向PHP解釋。甚至不要讓我開始不能捕捉簡單的錯誤,如錯字(讀取未設置的變量)或傳遞錯誤的參數數量...... – aib

+0

那裏 - 現在第二句話更強調了。 – aib