User Contributed Notes 42 notes

I, too, was dismayed to find that isset($foo) returns false if ($foo == null). Here's an (awkward) way around it.

unset($foo);if (compact('foo') != array()) { do_your_thing();}

Of course, that is very non-intuitive, long, hard-to-understand, and kludgy. Better to design your code so you don't depend on the difference between an unset variable and a variable with the value null. But "better" only because PHP has made this weird development choice.

In my thinking this was a mistake in the development of PHP. The name ("isset") should describe the function and not have the desciption be "is set AND is not null". If it was done properly a programmer could very easily do (isset($var) || is_null($var)) if they wanted to check for this!

A variable set to null is a different state than a variable not set - there should be some easy way to differentiate. Just my (pointless) $0.02.

and<?PHP$foo = new Foo;echo isset($foo->bar);?>will always echo 'false'. because the isset() accepts VARIABLES as it parameters, but in this case, $foo->bar is NOT a VARIABLE. it is a VALUE returned from the __get() method of the class Foo. thus the isset($foo->bar) expreesion will always equal 'false'.

Apparently, PHP4 converts the the string 'aaaa' to zero and then returns the string character at that position within the string $foo, when $foo is not an array. That means you can't assume you are dealing with an array, even if you used an expression such as isset($foo['aaaa']['bbb']['cc']['d']), because it will return true also if any part is a string.

PHP5 does not do this. If $foo is a string, the index must actually be numeric (e.g. $foo[0]) for it to return the indexed character.

Careful with this function "ifsetfor" by soapergem, passing by reference means that if, like the example $_GET['id'], the argument is an array index, it will be created in the original array (with a null value), thus causing posible trouble with the following code. At least in PHP 5.

The new (as of PHP7) 'null coalesce operator' allows shorthand isset. You can use it like so:

<?php// Fetches the value of $_GET['user'] and returns 'nobody'// if it does not exist.$username = $_GET['user'] ?? 'nobody';// This is equivalent to:$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

Note that isset() is not recursive as of the 5.4.8 I have available here to test with: if you use it on a multidimensional array or an object it will not check isset() on each dimension as it goes.

Imagine you have a class with a normal __isset and a __get that fatals for non-existant properties. isset($object->nosuch) will behave normally but isset($object->nosuch->foo) will crash. Rather harsh IMO but still possible.

<?php

class FatalOnGet {

// pretend that the methods have implementations that actually try to do work // in this example I only care about the worst case conditions

public function __get($name) { echo "(getting {$name}) ";

// if property does not exist {echo "Property does not exist!"; exit;// }}

Sometimes you have to check if an array has some keys. To achieve it you can use "isset" like this: isset($array['key1'], $array['key2'], $array['key3'], $array['key4'])You have to write $array all times and it is reiterative if you use same array each time.

The following is an example of how to test if a variable is set, whether or not it is NULL. It makes use of the fact that an unset variable will throw an E_NOTICE error, but one initialized as NULL will not.

The problem is, the set_error_handler and restore_error_handler calls can not be inside the function, which means you need 2 extra lines of code every time you are testing. And if you have any E_NOTICE errors caused by other code between the set_error_handler and restore_error_handler they will not be dealt with properly. One solution:

Hence, $varname should be a mixed value of var's to check for, and $parent can be an array or object, which will default to the GLOBAL scope. See the documentation of array_key_exists for further information.

This will allow to check if a var is in the current scope, object, or array... Whether it's a null, false, true, or any value. It depends on ARRAY_KEY_EXISTS for it's functionality which also works with Objects. Feel free to improve on this anyone ;D

If you regard isset() as indicating whether the given variable has a value or not, and recall that NULL is intended to indicate that a value is _absent_ (as said, somewhat awkwardly, on its manual page), then its behaviour is not at all inconsistent or confusing.

It's not just to check for uninitialised variables - a lot of the time those are just due to sloppy coding. There are other ways a variable could fail to have a value (e.g., it's meant to hold the value returned from a function call but the function didn't have a value to return) where uninitialising the variable would not be an option nor even make sense (e.g., depending on what was to be done with the returned value).

I know this is probably not the recommended way to do this, but it seems to work fine for me. Instead of the normal isset check to extract variables from arrays (like $_REQUEST), you can use the @ prefix to squelch any errors.

In response to 10-Feb-2006 06:02, isset($v) is in all (except possibly buggy) cases equivalent to !is_null($v). And no, it doesn't actually test if a variable is set or not by my definition "$v is set if unset($v) has no effect".

The doc says that isset "determines if a variable is set and is not NULL." I prefer to simply say that it "determines that a variable is set," that's it. Adding "is not NULL" is redundant, because isset($v) is the same as ! is_null($v) : http://php.net/manual/en/types.comparisons.php.

The extra "is not NULL" is actually a bit confusing. Some might start to complain that it would have been simpler to only determine that the variable is set, not realizing that it's exactly what isset does.

The purpose of the redundant "is not NULL" is to bring out that if a variable is set to NULL, isset will return false, but it was implicit in the definition of NULL.

The comment http://php.net/manual/en/function.is-null.php#80409 brings the interesting point that is_null will throw an error if the variable was not set at all. So, we can distinguish a variable that is unset through a NULL assignment and a variable that is simply not set at all. However, the returned value under is_null is the same in both cases, only the error message differs.

We can define another function that determines if the variable is "set," including "set" by a NULL assignment. It's a different concept, different definitions of isset, etc. Mixing these different concepts can be confusing.

In the current definitions for isset, is_null, NULL, etc., the extra "and is not NULL" in the definition of isset is redundant, because is_null is the opposite of isset. We should not mix that with the other concept mentioned above.

Using isset($array['key']) is useful, but be careful!using isset($array['key']['subkey']) doesn't work as one could expect, if $array['key'] is a string it seems that 'subkey' is converted to (integer) 0 and $array['key']['subkey'] is evaluated as the first char of the string. The solution is to use is_array($array['key']) && isset($array['key']['subkey'])