I would recommend reading the PHP manual, on the "type comparison" page: http://www.php.net/manual/en/types.comparisons.php
$a 'exists' but is set to NULL; isset and is_null will return FALSE and TRUE, respectively.
NULL is not really a value, but the variable exists. For example:
$ php -r 'if(is_null($b)) { echo("\$b is null\n"); }'
PHP Notice: Undefined variable: b in Command line code on line 1
Notice: Undefined variable: b in Command line code on line 1
$b is null
$b, in this case, was undefined, and something that isn't set is "NULL" in a way, but since it isn't set, it's going to trigger an error. If $b had be assigned NULL in a previous expression, there would be no warning triggered.
Furthermore, there is no default value for a variable, so one cannot define a variable like so:
$b;
Without assigning it to anything. It will trigger an error if $b is referenced by an expression.
$ php -r '$b; echo($b);'
PHP Notice: Undefined variable: b in Command line code on line 1
Notice: Undefined variable: b in Command line code on line 1
Anyways, the tables on the page I linked have a very good explanation of how these things all map to each other.
Cheers.