237

I have a question regarding NULL in PHP:

  $a = '';
  if($a == NULL) {
      echo 'is null';
  }

Why do I see is null when $a is an empty string? Is that a bug?

0

10 Answers 10

385

What you're looking for is:

if($variable === NULL) {...}

Note the ===.
When use ==, as you did, PHP treats NULL, false, 0, the empty string, and empty arrays as equal.

Sign up to request clarification or add additional context in comments.

8 Comments

False, your condition only matches uninitialized and null $variable. What you want is actually: $variable == null (note the ==)
@ThomasLAURENT, that's what the OP was looking for, they were wondering why == null was matching the empty string and not just null or undefined.
Oups my mistake, but your last sentence led me think NULL, false, 0 and "" were strictly equal which is wrong, sorry for the misunderstanding.
@James it's an intended behaviour in PHP, it's still true even in 2017 and will be true for a long time I suppose
$a = '' is an empty string, false is a boolean, $a = 0; is an integer and null is from type null. What OP is telling is that PHP will thread them as "same" in value, but not as "same" in type. So a strict === check will also check for type and fail if you use different ones. That's the reason you should be consistence in your return values. If you normaly return a string in a method like getName(), you shouldn't get null when it's empty, but more likely an emtpy string $user->getName() === '' or $user->getId() === 0 or $user->isActive === false. Intended behaviour!
|
260

As is shown in the following table, empty($foo) is equivalent to $foo==null and is_null($foo) has the same function of $foo===null. The table also shows some tricky values regarding the null comparison. (ϕ denotes an uninitialized variables. )

         empty    is_null 
         ==null  ===null  isset   array_key_exists
      ϕ |   T   |   T   |   F   |   F   
   null |   T   |   T   |   F   |   T   
     "" |   T   |   F   |   T   |   T   
     [] |   T   |   F   |   T   |   T
      0 |   T   |   F   |   T   |   T      
  false |   T   |   F   |   T   |   T   
   true |   F   |   F   |   T   |   T   
      1 |   F   |   F   |   T   |   T   
     \0 |   F   |   F   |   T   |   T   

6 Comments

Missing "0" and "0.0" in the table. They make things really tricky, especially empty(). That's why I avoid using empty().
@PHPst Base on the table that you shown, so what is actually the php code of what you called 'simple comparison'?
@hyip ==nulland ===null.
This should be the top answer, much more complete. Thanks.
@PHPst You said that simple comparison is less ambiguous. Can you please provide an example of using simple comparison instead of these NULL empty() etc.
|
36

check == vs ===

'' == NULL would return true
0 == NULL would return true
false == null would return true

where as

'' === NULL would return false
0 === NULL would return false
false === NULL would return false

1 Comment

Tested and correct. ''==null (true) while ''===null(false)
20

No it's not a bug. Have a look at the Loose comparisons with == table (second table), which shows the result of comparing each value in the first column with the values in the other columns:

    TRUE    FALSE   1       0       -1      "1"     "0"     "-1"    NULL    array() "php"   ""

    [...]    

""  FALSE   TRUE    FALSE   TRUE    FALSE   FALSE   FALSE   FALSE   TRUE    FALSE   FALSE   TRUE

There you can see that an empty string "" compared with false, 0, NULL or "" will yield true.

You might want to use is_null [docs] instead, or strict comparison (third table).

3 Comments

The Loose comparisons table seems to suggest that comparing 0=="php" or "php"==0 will both yield true. What is going on there?
@Robert: A string not starting with digits is converted to 0 when cast to a string: codepad.org/qi40SG3E. So (int)"php" == 0.
@Robert: I meant "when cast to a number".
13

This is not a bug but PHP normal behavior. It happens because the == operator in PHP doesn't check for type.

'' == null == 0 == false

If you want also to check if the values have the same type, use === instead. To study in deep this difference, please read the official documentation.

Comments

10

PHP 7 isset() vs empty() vs is_null()

enter image description here

Comments

9

If you use ==, php treats an empty string or array as null. To make the distinction between null and empty, either use === or is_null. So:

if($a === NULL) or if(is_null($a))

1 Comment

if($a === NULL)
0

Just to addon if someone is dealing with  , this would work if dealing with  .

Replace it with str_replace() first and check it with empty()

empty(str_replace(" " ,"" , $YOUR_DATA)) ? $YOUR_DATA = '--' : $YOUR_DATA;

Comments

0

NULL stands for a variable without value. To check if a variable is NULL you can either use is_null($var) or the comparison (===) with NULL. Both ways, however, generate a warning if the variable is not defined. Similar to isset($var) and empty($var), which can be used as functions.

var_dump(is_null($var)); // true
var_dump($var === null); // true
var_dump(empty($var)); // true

Read more in How to check if a variable is NULL in PHP?

Comments

-1

Use empty - http://php.net/manual/en/function.empty.php.

Example:

$a = '';
if(empty($a)) {
    echo 'is empty';
}

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.