isset and empty in PHP

05 Jun 2017 in PHP

Sometimes you may be in confusion about the proper use of isset and empty functions in PHP when testing for the existence of a variable, array key or object property.

For these two functions, the PHP manual states:

isset: Determine if a variable is set and is not NULL. If multiple parameters are supplied then isset() will return TRUE only if all of the parameters are set. Evaluation goes from left to right and stops as soon as an unset variable is encountered.

empty: Determine whether a variable is considered to be empty. A variable is considered empty if it does not exist or if its value equals FALSE. empty() does not generate a warning if the variable does not exist.

Because the check for NULL in isset is using the identity comparison (===), while in empty the equality comparison (==) is used, it may sometimes lead to unexpected behaviour from a programmer's point of view.

My preference in general is to use empty (which can be seen as a shorthand for !isset($var) || !$var) and use isset when trying to access keys in arrays or properties in objects.

As an example, look at the following:

                            | isset() | empty() |
                            |---------|---------|
$foo                        | false   | true    |
$null        = null;        | false   | true    |
$false       = false;       | true    | true    |
$true        = true;        | true    | false   |
$emptyString = "";          | true    | true    |
$arr         = [];          | true    | true    |
$array       = ['k'=>'v'];  | true    | false   |
               $array['k']  | true    | false   |
               $array['X']  | false   | true    |