2013-07-09 13 views
5

Według http://www.php.net/manual/en/reserved.variables.globals.php:

Tablica asocjacyjna zawierająca odnośniki do wszystkich zmiennych, które są aktualnie zdefiniowanych w zakresie globalnym skryptu.

więc następujący kod musi wykazywać, że $ GLOBALS var ma _SERVER, _ENV (jeśli jest włączona w variables_order w php.ini) i _REQUEST klawisze:

var_dump($GLOBALS); 

wynik jest:

  • Pod nginx + php-fpm: brakuje _SERVER, _ENV, _REQUEST
  • Pod CLI: brak _ENV, _REQUEST

Hmm .. może jest smth w docs o takim zachowaniu? Przejrzałem każdej strony dla każdej zmiennej:

i mam nie znaleziono wzmianki o takim zachowaniu. Dlaczego to działa?

Zainstalowałem php przy użyciu pakietu debian z http://www.dotdeb.org/ repo (nic nie zostało skompilowane ręcznie) ... Obecnie działa z nginx + php5-fpm. Czy to jest błąd php?

+0

A co jeśli zrobiłeś 'var_dump ($ _ SERVER);'? – HamZa

+1

Nie jestem pewien, ale spójrz na ustawienie ['variables_order'] (http://www.php.net/manual/en/ini.core.php#ini.variables-order) –

+4

$ _SERVER jest również zmienna superglobalna, taka sama jak $ GLOBALS, dlatego nie jest przechowywana w $ GLOBALS: 'Jest to 'superglobalna' lub automatyczna globalna zmienna. Oznacza to po prostu, że jest on dostępny we wszystkich zakresach w całym skrypcie.Nie ma potrzeby tworzenia globalnej zmiennej $; aby uzyskać do niego dostęp w ramach funkcji lub metod. "i' $ _SERVER jest tablicą zawierającą informacje takie jak nagłówki, ścieżki i lokalizacje skryptów. Wpisy w tej tablicy są tworzone przez serwer WWW. Nie ma żadnej gwarancji, że każdy serwer WWW dostarczy dowolny z tych serwerów, niektóre serwery mogą pominąć lub dostarczyć inne, nie wymienione tutaj ... ' –

Odpowiedz

6

Utworzyłem błąd na stronie php.net i zespół php odpowiedział: https://bugs.php.net/bug.php?id=65223

Podsumowanie:

To nie jest błąd. super-globals (aka, auto globals) nie są domyślnie dodawane do tabel symboli z powodów związanych z wydajnością, chyba że parser widzi potrzebę. tj

<?php $_SERVER; print_r($GLOBALS); ?>

będzie go wymienić. Można również kontrolować to przy użyciu auto_globals_jit w php.ini: zespół php http://www.php.net/manual/en/ini.core.php#ini.auto-globals-jit

Dzięki tak odpowiedzieć tak szybko!

+0

Dzięki za opinie – thibauts

Powiązane problemy