There is absolutely no difference in functionality between is_null and === null.
The only difference is that is_null is a function and thus
- is marginally slower (function call overhead)
- can be used as a callback, e.g.
array_map('is_null', $array).
Personally, I use null === whenever I can, as it is more consistent with false === and true === checks.
If you want, you can check the code: is_identical_function (===) and php_is_type (is_null) do the same thing for the IS_NULL case.
The related isset() language construct checks whether the variable actually exists before doing the null check. So isset($undefinedVar) will not throw a notice.
Also note that isset() may sometimes return true even though the value is null – this is the case when it is used on an overloaded object, i.e. if the object defines an offsetExists/__isset method that returns true even if the offset is null (this is actually quite common, because people use array_key_exists in offsetExists/__isset).