2014-03-03 35 views
0

我的問題是關於使用is_null()is_null()的要點是什麼?

我讀過其他問題,討論​​,但我更關心爲什麼有一個is_null()函數呢?

一些測試來解釋我的想法:

<?php 

header('Content-type: text/plain'); 
error_reporting(-1); 

$test = 'Hello, World!'; 
$test2 = null; 
$test3 = ''; 

var_dump(is_null($test)); 
var_dump(null === $test); 
var_dump(isset($test)); 

var_dump(is_null($test2)); 
var_dump(null === $test2); 
var_dump(isset($test2)); 

var_dump(is_null($test3)); 
var_dump(null === $test3); 
var_dump(isset($test3)); 

var_dump(is_null($test4)); 
var_dump(null === $test4); 
var_dump(isset($test4)); 

這將產生以下輸出:

bool(false) 
bool(false) 
bool(true) 
bool(true) 
bool(true) 
bool(false) 
bool(false) 
bool(false) 
bool(true) 

Notice: Undefined variable: test4 in C:\home\ombrelle.co.uk\templates_core\test.php on line 22 
bool(true) 

Notice: Undefined variable: test4 in C:\home\ombrelle.co.uk\templates_core\test.php on line 23 
bool(true) 
bool(false) 

正如你所看到的,使用is_null()功能或比較法時,它會拋出一個請注意,所以您不得不使用isset()。所以從來沒有看到使用這些方法的通知的唯一方法是當它不是null

此外,還應考慮以下幾點:

<?php 

header('Content-type: text/plain'); 
error_reporting(-1); 

var_dump((is_null($test1)) ? 'test1' : $test); 
var_dump((null == $test2) ? 'test2' : $test); 
var_dump((isset($test3)) ? 'test3' : $test); 

給下面的輸出:

Notice: Undefined variable: test1 in C:\home\ombrelle.co.uk\templates_core\test.php on line 6 
string(5) "test1" 

Notice: Undefined variable: test2 in C:\home\ombrelle.co.uk\templates_core\test.php on line 7 
string(5) "test2" 

Notice: Undefined variable: test in C:\home\ombrelle.co.uk\templates_core\test.php on line 8 
NULL 

在這裏,在三元聲明,上述工作中,仍然有通知,但是isset()方法現在沒有按」 t工作。如何正確地進行此操作,而不顯示通知?

畢竟,我只是爲了接受通知是毫無意義的,不應該發送到我的錯誤日誌,或者是否還有其他注意事項我應該考慮?

我們目前正在清理一箇舊系統中存在很多錯誤 - 我們不想錯過任何錯誤,但也沒有意思爲我們自己創造更多錯誤。任何關於此事權威性閱讀的鏈接也都非常感謝。

+0

看來你不辨具有'未定義null'價值和可變的變量。這些是不同的事情。 –

+1

換句話說:is_null是一個函數,就像is_bool,is_int,is_​​。僅僅因爲null類型只有1個可能的值,所以它實際上等於=== null。這就像is_bool等於($ var === true或$ var === false)。比較中的一個不存在的變量被視爲一個沒有值的變量(即null),因此在null === $ undefined時返回true。但是,當將無變量作爲參數傳遞給函數時,函數不會收到任何內容,但它至少需要某些內容,因此會返回通知。 – Tularis

+0

我覺得我這裏困惑的是'$ something = null; var_dump(isset($ something));'將輸出'false'。它不是*實際上*當使用'is_null'的時候會拋出錯誤,如果它被設置爲'null'的話。奇怪的。還是我很傻? – LeonardChallis

回答

2

is_null()查找變量是否爲NULL

你真的需要isset()它確定是否一個變量被設定,並沒有NULL。如果變量存在且返回值爲TRUE且值不是NULL,否則爲FALSE

例如,

$something = null; then isset($something) returns false 
$something = 'some value'; then isset($something) returns true 
+0

正如我在上面回覆@Tularis時提到的,當我把'$ something = null; var_dump(isset($ something));',它會返回'false'。所以除非**知道**它確實設置了(即不是在編碼時),否則我不能使用'is_null',對吧? – LeonardChallis

+0

@LeonardChallis編輯了我的答案 –

0

我能想到的唯一的區別(除了存在方式較慢 - 就像在您發佈的鏈接答案的答案),是is_null允許使用的horrible @ operator

<?php 
    error_reporting(E_ALL); 

    var_dump($foo === null); //Notice 
    var_dump(@is_null($foo)); //No notice 
?> 

DEMO

這就是說,如果你不知道,如果一個變量存在,你應該使用isset而不是is_null

最重要的是,你可能會感興趣的Best way to test for a variable's existence in PHP; isset() is clearly broken

+2

'is_null'是一種檢查變量類型的方法。 '=== null'檢查'type'和'value'。由於「空類型」只有一個可能的值,因此這兩個實際上是相同的。然而,存在is_null以保持語言的一致性(即,與「is_bool」,「is_int」,「is_object」,「is_array」等平行) – Tularis