$ _REQUEST не создается при использовании переменных переменных? - PullRequest
3 голосов
/ 16 января 2010

Рассмотрим следующие фрагменты кода:

Приложение 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 superglobal, если я попробую его с $_GET, $_POST или $_COOKIE, все эксперименты работают нормально, без выдачи сообщений об ошибках.

Я предполагаю, что это ошибка PHP? Я работаю на PHP 5.3.0.

Ответы [ 4 ]

7 голосов
/ 16 января 2010

(я тестировал с PHP 5.3.1)

Одна забавная вещь состоит в том, что эта часть кода:

<?php
var_dump(${'_' . 'REQUEST'});

Получает уведомление Undefined variable: _REQUEST


Но вот этот:

<?php
var_dump($_REQUEST);
var_dump(${'_' . 'REQUEST'});

Не уведомляет и отображает два пустых массива.


Какое-то время я думал, что это может быть связано с auto_globals_jit, но $_REQUEST не кажется заинтересованным этой директивой ... Но здесь есть одна интересная вещь:

Использование переменных SERVER и ENV проверено во время компиляции так используя их, например, переменная переменные не вызовут их инициализации.

Возможно, в конце концов, даже если в руководстве не сказано, 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 - даже если это не упоминается в руководстве.

2 голосов
/ 16 января 2010

Обратите внимание, что переменные переменные нельзя использовать с суперглобальными массивами PHP внутри функций или методов класса. Переменная $ this также является специальной переменной, на которую нельзя ссылаться динамически.

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

Это, скорее всего, связано с:

Использование переменных SERVER и ENV проверяется во время компиляции, поэтому их можно использовать, например, через. переменные переменные не будут вызывать их инициализацию.

Из ответа Паскаля.

Что может быть связано с опцией auto_globals_jit.

0 голосов
/ 16 января 2010

Нашел отчет об "ошибке" . Согласно tony2001 @ php это не ошибка:

Переменные: суперглобальные нельзя использовать в качестве переменных переменных внутри функции или методы класса.

Эта страница говорит то же самое , но странно, что это происходит только с $_REQUEST, другие суперглобальные объекты GPC не вызывают уведомление об ошибке, может кто-нибудь перепроверить это

0 голосов
/ 16 января 2010

Я иду с ошибкой, так как $ _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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...