2010-01-16 79 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超全局不會引發錯誤通知,任何人都可以仔細檢查呢?