PHP $ _GET / $ _ POST через переменные - PullRequest
4 голосов
/ 14 марта 2012

Я пытаюсь динамически обращаться к массивам $ _GET и $ _POST, среди прочего, используя переменные переменные. Причина, по которой я пытаюсь это сделать, заключается в том, что я могу выполнять аналогичные действия с несколькими массивами без необходимости объявлять конкретные итерации для каждого. Я вполне уверен, что это возможно, поскольку в документации PHP говорится, что он может использовать переменные переменные для динамического доступа к массиву, однако я не могу заставить его работать. Простая демонстрация - это когда я пытаюсь проверить, установлено ли определенное свойство.

if(isset(${$this->_array}[$property])) { return ${$this->_array}[$property]; }
else { return null; }

Когда я запускаю приведенный выше скрипт, я всегда получаю нулевое значение, однако, когда я статически ищу нужное свойство, вручную используя $ _GET или $ _POST, я получаю желаемый результат. Я трижды проверил $this->_array и $property, и они возвращают правильные строковые значения. Эти массивы недоступны для такого доступа или я что-то не так делаю?

Ответы [ 6 ]

6 голосов
/ 14 марта 2012

Суперглобальные переменные (такие как $_POST) нельзя использовать в качестве переменных переменных в функциях .

Вы можете сказать что-то вроде $post = $_POST;, а затем использовать 'post', и это будет работать, но непосредственное использование '_POST' не будет.

4 голосов
/ 14 марта 2012

На суперглобальные переменные нельзя ссылаться как на переменные внутри классов или методов, поэтому это будет работать:

<?php
$var = "_GET";
print_r(${$var});

Но это не будет:

<?php
test();
function test() {
  $var = "_GET";
  print_r(${$var});
}

Я подозреваю, что есть лучший способ сделать то, что вы пытаетесь достичь.

http://php.net/manual/en/language.variables.superglobals.php#refsect1-language.variables.superglobals-notes

3 голосов
/ 14 марта 2012

Что бы вы ни делали неправильно, использование переменных переменных, вероятно, ухудшает ситуацию.Для вашего же здравомыслия, пожалуйста, остановитесь.Они никогда не должны быть развернуты в рабочем коде ни при каких обстоятельствах.Их невозможно отладить, и использование их в вашем коде похоже на попытку прочитать что-то, что кто-то другой написал своими ногами.Если у них особенно ловкие ноги, то, возможно, вы сможете понять, что они делают.Но в 99,9999% случаев лучше использовать обычные массивы.

При этом попробуйте вместо этого $_REQUEST.

2 голосов
/ 14 марта 2012

Уже есть массив, который содержит как $_GET, так и $_POST.Он называется $_REQUEST.Сказав это, он также может содержать содержимое $_COOKIE в зависимости от настройки request_order, но по умолчанию это просто $_GET и $_POST.

0 голосов
/ 12 марта 2013

Вы можете сделать это, но не знаете, хорошая ли это практика кодирования

if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
     $method = '_POST';
 }
 else {
    $method = '_GET';
 }
 $data = $$method;
0 голосов
/ 14 марта 2012

Вы говорите, что хотите получить доступ к both the $_GET and $_POST arrays, among others - что это за «другие»?Вы можете использовать $_REQUEST для проверки содержимого $_GET, $_POST и $_COOKIE одновременно.

...