isset()和PHP全局变量

I have a question about global variable initialization.

function hello_testing() {
  global $conditional_random;
  if (isset($conditional_random)) {
      echo "foo is inside";  
  }
}

The global variable (conditional_random) may not be initialized before the hello_testing() function is called.

So, what happens to my validation via isset() when $conditional_random is not initialized? Will it fail or it will always be true?

Well, why don't you just test ? ;-)

Note : Not as easy as you'd think -- read the full answer ;-)


Calling the hello_testing(); function, without setting the variable :

hello_testing();

I get no output -- which indicates isset returned false.


Calling the function, after setting the variable :

$conditional_random = 'blah';
hello_testing();

I get an output :

foo is inside

Which indicates global works as expected, when the variable is set -- well, one should not have any doubt about that ^^



BUT note that isset will return false if a variable is set, and null !
See the manual page of isset()

Which means that a better test would be :

function hello_testing() {
  global $conditional_random;
  var_dump($conditional_random);
}

hello_testing();

And this displays :

null

No Notice : the variable exists ! Even if null.

As I didn't set the variable outside of the function, it shows that global sets the variable -- but it doesn't put a value into it ; which means it's null if not already set outside the function.


While :

function hello_testing() {
  //global $conditional_random;
  var_dump($conditional_random);
}

hello_testing();

Gives :

Notice: Undefined variable: conditional_random

Proves that notices are enabled ;-)

And, if global didn't "set" the variable, the previous example would have given the same notice.


And, finally :

function hello_testing() {
  global $conditional_random;
  var_dump($conditional_random);
}

$conditional_random = 'glop';
hello_testing();

Gives :

string 'glop' (length=4)

(Purely to demonstrate my example is not tricked ^^ )

Global sets the variable. Therefore isset($some_globald_variable) will always return true.

The better option is empty()

 if(empty($globald_variable))
 {
 // variable not set
 } 

You can check to see if the global has been created by checking if the key exists in $GLOBALS:

echo array_key_exists('fooBar', $GLOBALS)?"true
":"false
";
//Outputs false

global $fooBar;

echo array_key_exists('fooBar', $GLOBALS)?"true
":"false
";
//Outputs true

echo isset($fooBar)?"true
":"false
";
//Outputs false

This is the only way I know of to check the existence of a global without trigging a warning.

As Manos Dilaverakis mentioned, you should avoid using globals whenever possible.