2010-01-16 76 views
3

考虑下面的代码片断:

附录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

什么更奇怪的是,这只发生在超全球的$_REQUEST,如果我用$_GET,$_POST$_COOKIE所有实验都能正常工作,不会引发错误通知。

我猜这是一个PHP的错误?我正在运行PHP 5.3.0

+0

如果是这样的话,我觉得php的bug也是如此。 – Sarfraz 2010-01-16 16:38:04

回答

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影响...


而且,可以肯定,我在php.ini文件设为关auto_globals_jit

; 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

也许有可能''_REQUEST'全局是永远不会被创建的,除非你直接访问它,并且串联在一起不会触发它的创建。如果是这样,编程会非常糟糕。 – 2010-01-16 16:47:28

+0

在您链接的页面上,它指出您不能在超全局数组中使用变量变量。可能是由你刚给我们的那条线所造成的。 – 2010-01-16 16:49:59

+0

@ Chacha102:我在您发表评论的同时编辑了我的帖子,复制粘贴了关于该帖子的注释(并且我刚刚看到您发布了另一个引用该手册中另一部分内容的说明,指出同一类型的内容) - 这个评论在你的第二个之后到达,但是在我看到它之前发布,btw ^^ – 2010-01-16 16:50:57

0

我与自$ _GET等的bug会做的工作 它没有在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,这不会与超级全局工作,对不起 - 谢谢Cacha102

2

请注意,变量变量不能用于函数或类方法中的PHP Superglobal数组。变量$ this也是一个不能动态引用的特殊变量。使用它们通过例如SERVER和ENV变量

使用在编译时间,以便检查:

http://www.php.net/manual/en/language.variables.variable.php

这是最有可能与变量变量不会导致它们的初始化。

从帕斯卡的答案。

哪一个都可以返回到auto_globals_jit选项。

0

找到这个"bug" report。据tony2001 @ PHP这是不是一个错误:

可变变量:超级全局 不能被用作可变变量 内部函数或类方法。

This page says the same thing,但什么是奇怪的是,这仅与$_REQUEST情况下,其他GPC超全局不会引发错误通知,任何人都可以仔细检查呢?