2013-08-13 13 views
5

Ważna uwaga: $GLOBALS są brudne i złe. Nie używaj ich. Zawsze. Nigdy przenigdy.
Proszę skupić się na fakt, że to nie działa, a nie dlaczego robisz to w pierwszej kolejności, to czysto teoretyczne pytanie o ćwiczenia techniczne.

To jest dość dziwne. Próbuję skonstruować zmienną za pomocą ciągu o nazwie $GLOBALS.

Od zasięgu globalnym

Zobaczmy, co możemy uzyskać, gdy var_dump() ing to w zasięgu globalnym.

$g = sprintf('%s%s%s%s%s%s%s', chr(71), chr(76), chr(79), chr(66), chr(65), chr(76), chr(83)); 
var_dump($$g); 

Wynik jest tablicą zmiennych globalnych, które można zobaczyć here. Wspaniały! Więc spróbujmy tego w funkcji.

Z zakresu funkcji

Pierwszy, po prostu upewnij się, że rzeczywiście możemy uruchomić sprawdzanie wewnątrz funkcji $GLOBALS.

function globalAllTheThings() 
{ 
    var_dump($GLOBALS); 
} 

globalAllTheThings(); 

wynik jest: działa !! Możesz zobaczyć to here.

Teraz wypróbujmy pierwszy test, którego użyliśmy w zasięgu globalnym, w ramach funkcji i zobaczmy, co się stanie.

function globalAllTheThings() 
{ 
    $g = sprintf('%s%s%s%s%s%s%s', chr(71), chr(76), chr(79), chr(66), chr(65), chr(76), chr(83)); 
    var_dump($$g); 
} 

globalAllTheThings(); 

Dla uproszczenia sake

Można również spróbować tej bez upiorny zaciemniania (nie pytajcie).

function globalAllTheThings() 
{ 
    $g = 'GLOBALS'; 
    var_dump($$g); 
} 

globalAllTheThings(); 

To zwraca NULL. O co chodzi? Dlaczego zwraca NULL i co mogę zrobić, aby to zadziałało. Dlaczego pytasz? Oczywiście do celów edukacyjnych i dla nauki!

ALL THE THINGS, SRSLY

+2

Dla uproszczenia, nie możesz napisać '$ g = 'GLOBALS'' zamiast swojego dziwnego' sprintf-chr'? Nie powinno to wpływać na wynik. Gdyby tak było, byłoby wart całe, jeszcze inne pytanie. – deceze

+3

Ponieważ jest PHP. –

+2

Ponieważ '$ {'string'}' szuka zmiennej w podanym zakresie. – Leri

Odpowiedz

4

Ponieważ instrukcja mówi tak:

Ostrzeżenie

Należy pamiętać, że zmienne zmienne nie mogą być używane z superglobalną tablic PHP w obrębie funkcji lub metod klasy. Zmienna $this jest również specjalną zmienną, której nie można dynamicznie przywoływać.

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

To po prostu "specjalne". PHP jest "specjalne". Superglobals nie grają według tych samych reguł, co zwykłe zmienne. Ktoś zapomniał lub zdecydował, że nie będzie kompatybilny ze zmiennymi zmiennymi w funkcjach. Kropka.

+0

Wow, miłe znalezisko. Zrobiłem "RTFM" w tej sprawie, ale musiałem to przegapić. Co za błąd. – Jimbo

+3

... gdzie "specjalne" jest używane w znaczeniu wysoce politycznie niepoprawnym. – DaveRandom

+0

@Dave PHP jest językiem wśród języków programowania, który jest w większości zdefiniowany przez jego wyjątki, a nie reguły ...;) – deceze

Powiązane problemy