4
$_POST['asdf'] = 'something';

function test() {
    // NULL -- not what initially expected
    $string = '_POST';
    echo '====';
    var_dump(${$string});
    echo '====';

    // Works as expected
    echo '++++++';
    var_dump(${'_POST'});
    echo '++++++';

    // Works as expected
    global ${$string};
    var_dump(${$string});

}

// Works as expected
$string = '_POST';
var_dump(${$string});

test();

I am not getting why such behaviour.. can anybody explain.. i need to know why such behaviours. i am actually not getting the code..

Jaimin
  • 801
  • 2
  • 12
  • 27

2 Answers2

10

Look at here

Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods. The variable $this is also a special variable that cannot be referenced dynamically.

Shakti Singh
  • 84,385
  • 21
  • 134
  • 153
  • can u explain me the third vardump inside test function – Jaimin May 30 '11 at 12:30
  • @Jaimin: This is because of `global ${$string};` global declaration. If you comment out this line of code you will see the third var_dump also not working – Shakti Singh May 30 '11 at 12:35
  • Third `var_dump()` might work because `global ${$string}}` might create a local variable that refers to a global variable. I'm not sure that it really is what is technically being done when using `global` keyword, but that's my guess. – binaryLV May 30 '11 at 12:45
  • singh: by global ${$string}; this we are using superglobals and PHP says that "Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods. The variable $this is also a special variable that cannot be referenced dynamically." so how is it possilbe.. – Jaimin May 30 '11 at 13:24
  • @Jaimin:You should Look at @mario 's answer he explained very well how it is working – Shakti Singh May 30 '11 at 13:26
4

PHP does not have real global variables. The "superglobals" are also a misnomer. $_POST and $_GET are never present in the local variable hash tables. They exist as aliases, which PHP only sees for ordinary accesses. The variable variable access method only ever looks into the current local hash table.

global $$string;
  //   $$string = & $GLOBALS[$string];

Is a nifty trick to create a reference to the superglobals in the local hash table. This is why after that statement, you are able to use variable variables to access the "superglobals".

mario
  • 144,265
  • 20
  • 237
  • 291