$_REQUEST not created when using variable variables?
Consider the following snippets of code:
开发者_JAVA百科Exhibit A:
$_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true);
Exhibit B:
${'_REQUEST'} = json_decode(stripslashes(json_encode(${'_REQUEST'}, JSON_HEX_APOS)), true);
Exhibit C:
${'_' . 'REQUEST'} = json_decode(stripslashes(json_encode(${'_' . 'REQUEST'}, JSON_HEX_APOS)), true);
Both exhibit A and B work perfectly fine, exhibit C however displays a very strange error message:
Notice: Undefined variable: _REQUEST
What makes it even more weird is that this only happens with the $_REQUEST
superglobal, if I try it with $_GET
, $_POST
or $_COOKIE
all experiments work fine without raising error notices.
I'm guessing this is a PHP bug? I'm running on PHP 5.3.0
.
(I tested with PHP 5.3.1)
One funny thing is that this portion of code :
<?php
var_dump(${'_' . 'REQUEST'});
Gets the notice Undefined variable: _REQUEST
But this one :
<?php
var_dump($_REQUEST);
var_dump(${'_' . 'REQUEST'});
Doesn't give any notice, and shows two empty arrays.
For a while, I though this could be related to auto_globals_jit
, but $_REQUEST
doesn't seem to the concerned by that directive... But there is one interested thing said, here :
Usage of SERVER and ENV variables is checked during the compile time so using them through e.g. variable variables will not cause their initialization.
Maybe, after all, even if it's not said in the manual, auto_globals_jit
has an impact on $_REQUEST
...
And, to be sure, I turned Off auto_globals_jit
in my php.ini
file :
; When enabled, the SERVER and ENV variables are created when they're first
; used (Just In Time) instead of when the script starts. If these variables
; are not used within a script, having this directive on will result in a
; performance gain. The PHP directives register_globals, register_long_arrays,
; and register_argc_argv must be disabled for this directive to have any affect.
; http://www.php.net/manual/en/ini.core.php#ini.auto-globals-jit
auto_globals_jit = Off
And tried this code again :
<?php
var_dump(${'_' . 'REQUEST'});
And I now get an empty array, and not a notice anymore.
So it seems auto_globals_jit
does indeed have an impact on $_REQUEST
-- even if it's not mentionned in the manual.
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.
http://www.php.net/manual/en/language.variables.variable.php
This is most likely related to:
Usage of SERVER and ENV variables is checked during the compile time so using them through e.g. variable variables will not cause their initialization.
From Pascal's Answer.
Which can all be related back to the auto_globals_jit
option.
I'm going with the bug since $_GET etc do work It's not been mentioned at the php bugtrack: http://bugs.php.net/
Maybe you should report it.
I did some quick debugging in Zend Studio:
<?php
var_dump( ${'_' . 'REQUEST'});
var_dump( ${'_REQUEST'});
var_dump( $_REQUEST);
And it seemed to work with the included PHP 5.2.10. Maybe you could use this as a workaround:
$foo = '_' . 'REQUEST'
$$foo //<-- is the same as $_REQUEST
EDIT: Woops, this wouldn't work with Superglobals, sorry -- thanks Cacha102
Found this "bug" report. According to tony2001@php it's not a bug:
Variable variables: Superglobals cannot be used as variable variables inside functions or class methods.
This page says the same thing, but what is weird is that this only happens with $_REQUEST
, other GPC superglobals don't raise the error notice, can anyone double-check this?
精彩评论