考虑以下代码片段:
图表A:
$_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true);
图表B:
${'_REQUEST'} = json_decode(stripslashes(json_encode(${'_REQUEST'}, JSON_HEX_APOS)), true);
图表C:
${'_' . 'REQUEST'} = json_decode(stripslashes(json_encode(${'_' . 'REQUEST'}, JSON_HEX_APOS)), true);
两个展示 A 和 B 工作完全正常,展示 C 然而会显示一条非常奇怪的错误消息:
注意:未定义的变量:_REQUEST
更奇怪的是,只有$_REQUEST
超全球才会发生这种情况,如果我使用$_GET
,$_POST
或$_COOKIE
进行尝试,所有实验都可以正常使用提出错误通知。
我猜这是一个PHP错误?我正在PHP 5.3.0
上运行。
答案 0 :(得分:7)
(我使用PHP 5.3.1测试过)
有趣的是这部分代码:
<?php
var_dump(${'_' . 'REQUEST'});
获取通知Undefined variable: _REQUEST
但是这一个:
<?php
var_dump($_REQUEST);
var_dump(${'_' . 'REQUEST'});
不发出任何通知,并显示两个空数组。
有一段时间,我虽然这可能与auto_globals_jit
有关,但$_REQUEST
似乎没有受到该指令的关注......但有一件有趣的事情说,在这里:
SERVER和ENV变量的用法是 在编译期间检查所以 通过例如使用它们variable variables不会导致他们的 初始化。
毕竟,即使手册中没有说明,auto_globals_jit
也会对$_REQUEST
产生影响......
而且,可以肯定的是,我在auto_globals_jit
文件中关闭了php.ini
:
; 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
再次尝试此代码:
<?php
var_dump(${'_' . 'REQUEST'});
我现在得到一个空数组,而不是通知。
所以似乎auto_globals_jit
确实对$_REQUEST
产生了影响 - 即使手册中没有提到它。
答案 1 :(得分:2)
请注意,变量变量不能与函数或类方法中的PHP的超全局数组一起使用。变量$ this也是一个无法动态引用的特殊变量。
http://www.php.net/manual/en/language.variables.variable.php
这很可能与:
有关在编译期间检查SERVER和ENV变量的用法,以便通过例如它们使用它们。变量变量不会导致它们的初始化。
来自Pascal的答案。
哪些都可以与auto_globals_jit
选项相关联。
答案 2 :(得分:0)
我正在使用这个bug,因为$ _GET等可以正常工作 在php bugtrack中没有提到它:http://bugs.php.net/
也许你应该举报。
我在Zend Studio中做了一些快速调试:
<?php
var_dump( ${'_' . 'REQUEST'});
var_dump( ${'_REQUEST'});
var_dump( $_REQUEST);
它似乎与包含的PHP 5.2.10一起使用。也许您可以将其用作解决方法:
$foo = '_' . 'REQUEST'
$$foo //<-- is the same as $_REQUEST
编辑:Woops,这不适用于Superglobals,对不起 - 谢谢Cacha102
答案 3 :(得分:0)
找到此"bug" report。根据 tony2001 @ php ,这不是一个错误:
变量变量:Superglobals 不能用作变量变量 内部函数或类方法。
This page says the same thing,但奇怪的是,这只发生在$_REQUEST
,其他GPC超级全球不会提出错误通知,任何人都可以仔细检查这个吗?