使用变量变量时是否未创建$ _REQUEST?

时间:2010-01-16 16:35:25

标签: php

考虑以下代码片段:

图表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上运行。

4 个答案:

答案 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超级全球不会提出错误通知,任何人都可以仔细检查这个吗?