微優化是不值得的。
你必須執行一千萬次才能注意到差異,略多於 2 秒
$a===NULL; 花費時間:1.2424390316 秒
is_null($a); 花費時間:3.70693397522 秒
差異 = 2.46449494362
差異 / 10,000,000 = 0.000000246449494362
===NULL 和 is_null 的執行時間差異不到 250 奈秒。去優化一些重要的事情吧。
value
要評估的變數。
範例 #1 is_null() 範例
<?php
error_reporting(E_ALL);
$foo = NULL;
var_dump(is_null($inexistent), is_null($foo));
?>
Notice: Undefined variable: inexistent in ... bool(true) bool(true)
null
類型微優化是不值得的。
你必須執行一千萬次才能注意到差異,略多於 2 秒
$a===NULL; 花費時間:1.2424390316 秒
is_null($a); 花費時間:3.70693397522 秒
差異 = 2.46449494362
差異 / 10,000,000 = 0.000000246449494362
===NULL 和 is_null 的執行時間差異不到 250 奈秒。去優化一些重要的事情吧。
看看 PHP 如何解析不同的值。$var 是變數。
$var = NULL "" 0 "0" 1
strlen($var) = 0 0 1 1 1
is_null($var) = TRUE FALSE FALSE FALSE FALSE
$var == "" = TRUE TRUE TRUE FALSE FALSE
!$var = TRUE TRUE TRUE TRUE FALSE
!is_null($var) = FALSE TRUE TRUE TRUE TRUE
$var != "" = FALSE FALSE FALSE TRUE TRUE
$var = FALSE FALSE FALSE FALSE TRUE
Peace!
在 PHP 7 (phpng) 中,`is_null` 實際上比 `===` 略快,儘管兩者之間的效能差異非常小。
PHP 5.5.9
is_null - float(2.2381200790405)
=== - float(1.0024659633636)
=== 每次呼叫快約 100 奈秒
PHP 7.0.0-dev (built: May 19 2015 10:16:06)
is_null - float(1.4121870994568)
=== - float(1.4577329158783)
is_null 每次呼叫快約 5 奈秒
2022 年在 PHP 8.1 上的快速測試確認仍然沒有必要對 NULL 檢查進行微優化
<?php
// 比較運算子
$before = microtime(true);
$var = null;
for ($i=0 ; $i<1000000000 ; $i++) {
if($var === null) {}
}
$after = microtime(true);
echo ' ===: ' . ($after - $before) . " 秒\n";
// 函式
$before = microtime(true);
$var = null;
for ($i=0 ; $i<1000000000 ; $i++) {
if(is_null($var)) {}
}
$after = microtime(true);
echo 'is_null: ' . ($after - $before) . " 秒\n";
// ===: 4.1487579345703 秒
// is_null: 4.1316878795624 秒
據我所知,`is_null($var)` 的回傳值與 `isset($var)` 完全相反,但如果 `$var` 尚未設定,`is_null($var)` 會拋出一個通知。
以下將證明這一點
<?php
$quirks = array(null, true, false, 0, 1, '', "\0", "unset");
foreach($quirks as $var) {
if ($var === "unset") unset($var);
echo is_null($var) ? 1 : 0;
echo isset($var) ? 1 : 0;
echo "\n";
}
?>
這會印出類似以下的結果
10 // null
01 // true
01 // false
01 // 0
01 // 1
01 // ''
01 // "\0"
注意:變數未定義:在 /srv/www/htdocs/sandbox/null/nulltest.php 的第 8 行,變數 $var 未定義
10 // (unset)
對於主要的特殊類型/值,`is_null($var)` 顯然總是返回與 `isset($var)` 相反的結果,而且該注意事項清楚地指出有問題的 `is_null()` 陳述式所在的行數。您可能需要詳細檢查這些函式的返回值,但由於兩者都被指定為返回布林值類型,因此應該沒有疑問。
再次查看 PHP 規格說明,`is_null()` 會檢查值是否為 null。因此,您可以傳遞任何「值」給它,例如函式的結果。
另一方面,`isset()` 應該檢查「變數」是否存在,這使得它成為一種語言結構而不是函式。它的唯一目的是進行該檢查。傳遞任何其他內容都會導致錯誤。
知道這一點,讓我們可以得出以下不太可能的結論
`isset()` 作為一種語言結構,比 `is_null()` 更快、更可靠且更強大,因此應該優先使用 `isset()`,除非您直接傳遞函式的結果,這無論如何都被認為是不良的程式設計習慣。