PHP: is_null - Manual (original) (raw)
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
is_null — Finds whether a variable is [null](reserved.constants.php#constant.null)
Description
Parameters
value
The variable being evaluated.
Examples
Example #1 is_null() example
`<?php
error_reporting
(E_ALL);$foo = NULL;
var_dump(is_null($inexistent), is_null($foo));?>`
See Also
- The
[null](reserved.constants.php#constant.null)type - isset() - Determine if a variable is declared and is different than null
- is_bool() - Finds out whether a variable is a boolean
- is_numeric() - Finds whether a variable is a number or a numeric string
- is_float() - Finds whether the type of a variable is float
- is_int() - Find whether the type of a variable is integer
- is_string() - Find whether the type of a variable is string
- is_object() - Finds whether a variable is an object
- is_array() - Finds whether a variable is an array
Found A Problem?
17 years ago
Micro optimization isn't worth it.
You had to do it ten million times to notice a difference, a little more than 2 seconds
$a===NULL; Took: 1.2424390316s
is_null($a); Took: 3.70693397522s
difference = 2.46449494362
difference/10,000,000 = 0.000000246449494362
The execution time difference between ===NULL and is_null is less than 250 nanoseconds. Go optimize something that matters.george at fauxpanels dot com ¶
17 years ago
See how php parses different values. $var is the variable.
$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!contact dot 01834e2c at renegade334 dot me dot uk ¶
10 years ago
In PHP 7 (phpng), is_null is actually marginally faster than ===, although the performance difference between the two is far smaller.
PHP 5.5.9
is_null - float(2.2381200790405)
=== - float(1.0024659633636)
=== faster by ~100ns per call
PHP 7.0.0-dev (built: May 19 2015 10:16:06)
is_null - float(1.4121870994568)
=== - float(1.4577329158783)
is_null faster by ~5ns per call
3 years ago
A quick test in 2022 on PHP 8.1 confirms there is still no need to micro-optimize NULL checks:
<?php
// Comparison Operator
$before = microtime(true);
$var = null;
for ($i=0 ; <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo><</mo><mn>1000000000</mn><mo separator="true">;</mo></mrow><annotation encoding="application/x-tex">i<1000000000 ; </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6986em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord">1000000000</span><span class="mpunct">;</span></span></span></span>i++) {
if($var === null) {}
}
$after = microtime(true);
echo ' ===: ' . ($after - $before) . " seconds\n";
// Function
$before = microtime(true);
$var = null;
for ($i=0 ; <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo><</mo><mn>1000000000</mn><mo separator="true">;</mo></mrow><annotation encoding="application/x-tex">i<1000000000 ; </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6986em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord">1000000000</span><span class="mpunct">;</span></span></span></span>i++) {
if(is_null($var)) {}
}
$after = microtime(true);
echo 'is_null: ' . ($after - $before) . " seconds\n";
// ===: 4.1487579345703 seconds
// is_null: 4.1316878795624 secondsai dot unstmann at combase dot de ¶
17 years ago
For what I realized is that is_null($var) returns exactly the opposite of isset($var) , except that is_null($var) throws a notice if $var hasn't been set yet.
the following will prove that:
<?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";
}
?>
this will print out something like:
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)
For the major quirky types/values is_null($var) obviously always returns the opposite of isset($var), and the notice clearly points out the faulty line with the is_null() statement. You might want to examine the return value of those functions in detail, but since both are specified to return boolean types there should be no doubt.
A second look into the PHP specs tells that is_null() checks whether a value is null or not. So, you may pass any VALUE to it, eg. the result of a function.
isset() on the other hand is supposed to check for a VARIABLE's existence, which makes it a language construct rather than a function. Its sole porpuse lies in that checking. Passing anything else will result in an error.
Knowing that, allows us to draw the following unlikely conclusion:
isset() as a language construct is way faster, more reliable and powerful than is_null() and should be prefered over is_null(), except for when you're directly passing a function's result, which is considered bad programming practice anyways.