微优化不值得。
你必须执行一千万次才能注意到差异,仅仅多出两秒钟
$a===NULL; 耗时: 1.2424390316s
is_null($a); 耗时: 3.70693397522s
差值 = 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
类型微优化不值得。
你必须执行一千万次才能注意到差异,仅仅多出两秒钟
$a===NULL; 耗时: 1.2424390316s
is_null($a); 耗时: 3.70693397522s
差值 = 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)
=== 快约 100ns/次调用
PHP 7.0.0-dev (built: May 19 2015 10:16:06)
is_null - float(1.4121870994568)
=== - float(1.4577329158783)
is_null 快约 5ns/次调用
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) . " seconds\n";
// 函数
$before = microtime(true);
$var = null;
for ($i=0 ; $i<1000000000 ; $i++) {
if(is_null($var)) {}
}
$after = microtime(true);
echo 'is_null: ' . ($after - $before) . " seconds\n";
// ===: 4.1487579345703 seconds
// is_null: 4.1316878795624 seconds
我发现 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"
Notice: Undefined variable: var in /srv/www/htdocs/sandbox/null/nulltest.php on line 8
10 // (unset)
对于主要的奇怪类型/值,is_null($var) 显然总是返回 isset($var) 的相反结果,并且通知清楚地指出了 is_null() 语句有问题的行。你可能想仔细检查这些函数的返回值,但由于两者都被指定为返回布尔类型,所以应该没有疑问。
再仔细看看 PHP 规范,就会发现 is_null() 检查一个值是否为 null。因此,你可以向其传递任何值,例如函数的结果。
另一方面,isset() 应该检查一个变量的存在性,这使其成为一个语言构造,而不是一个函数。它唯一的目的是进行这种检查。传递其他任何内容都会导致错误。
了解这一点,我们可以得出以下不太可能得出的结论
作为语言结构,`isset()` 比 `is_null()` 更快、更可靠且更强大,应该优先使用 `isset()`,除非您直接传递函数的结果,而这本身就被认为是不好的编程实践。
实际上,在高负载服务器场景下,使用 `=== NULL` 而不是 `is_null()` 会很有用,因为在这种场景下,每秒有数百或数千个请求。在整个 PHP 执行链中,对大量“简单”操作节省微秒通常会导致能够以相同的速度提供更多页面,或者降低 CPU 使用率。人们通常会编写非常糟糕且缓慢的代码。
`$var===NULL` 比 `is_null($var)` 快得多(结果相同)。
我进行了一些基准测试,迭代次数为 1000 万次。
`$a=null;`
`isset($a);` 用时:1.71841216087 秒
`$a==NULL;` 用时:1.27205181122 秒
$a===NULL; 耗时: 1.2424390316s
is_null($a); 耗时: 3.70693397522s
`$a=5;`
`isset($a);` 用时:1.15165400505 秒
`$a==NULL;` 用时:1.41901302338 秒
`$a===NULL;` 用时:1.21655392647 秒
`is_null($a);` 用时:3.78501200676 秒
`error_reporting(E_ALL&~E_NOTICE);`
`unset($a);`
`isset($a);` 用时:1.51441502571 秒
`$a==NULL;` 用时:16.5414860249 秒
`$a===NULL;` 用时:16.1273870468 秒
`is_null($a);` 用时:23.1918480396 秒
请注意,`isset` 仅包含在内是因为它在任何情况下都能提供良好的性能;然而,`isset` 并不相同,也不是相反的。
但您可能可以使用 `isset()` 来代替空值检查。
您不应该使用 `is_null`,除非您需要回调函数,或者为了与 `is_int`、`is_float` 等保持一致。
我发现,对于像 POST 这样的 HTTP 请求,`is_null` 并不是检查是否为空的最可靠选择。
尝试使用
`if(trim($var) == ""){`
// 执行某些操作
}
}
代替。
20 年前
关于在 MySQL 查询中避免 NULL,为什么不在 WHERE 子句中使用 IS NULL 和 IS NOT NULL。
`SELECT *`
`FROM someDatabase`
`WHERE someAttribute IS NOT NULL`
干杯,