2009-06-16 27 views
5

Od pewnego czasu rozwijam się w PHP i nadal nie miałem zadania, w którym musiałbym używać zmiennych zmiennych. Czy ktoś może podać mi przykłady, gdzie ich użycie jest dobrym pomysłem? A może były one zawarte w języku tylko dla zabawy?Kiedy używać zmiennej zmiennej w PHP?

+1

I tylko od czasu do czasu korzystać z PHP ... co heck jest "zmienną zmienną" w PHP? –

+3

$ foo = 42; $ bar = "foo"; $$ bar ==> 42 – jrockway

Odpowiedz

5

Jedną z sytuacji, w których musiałem ich użyć, jest przetwarzanie identyfikatorów URI, chociaż ta technika może być przestarzała, i co prawda nie korzystałem z niej od dłuższego czasu.

Załóżmy, że chcemy pobrać identyfikator URI ze skryptu w formacie domain.tld/controller/action/parameter/s. Możemy usunąć nazwę skryptu przy użyciu następujących:

$uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']); 

Aby wyodrębnić kontrolera, akcji i wartości parametrów z tym my będziemy mieć wybuchnąć ciąg przy użyciu separatora ścieżki „/”. Jednak jeśli mamy prowadzące lub końcowe ograniczniki, będziemy mieli pustych wartości tablicy upon eksplozji, więc powinniśmy przyciąć te z początku i końca łańcucha:

$uri_string = trim($uri_string, '/'); 

Możemy teraz wybuchnąć ścieżkę do tablicy :

$uri_data = explode('/', $uri_string); 

$uri_data[0] zawiera teraz naszą nazwę kontrolera, $uri_data[1] zawiera nazwę działania, a wartości w tablicy poza tym to parametry, które powinny być przekazywane do metody działania.

$controller_name = $uri_data[0]; 
$action_name = $uri_data[1]; 

Więc teraz, że mamy te nazwy, możemy wykorzystać je do wielu rzeczy. Jeśli przechowujesz kontrolery w ściśle określonym katalogu względem katalogu głównego witryny, możesz użyć tych informacji do require_once klasy kontrolera. W tym momencie można instancję i wywołać ją za pomocą zmiennych Zmienna:

$controller = new $controller_name(); 
$controller->{$action_name}(); // Or pass parameters if they exist 

Istnieje wiele pułapek bezpieczeństwa należy zwrócić uwagę w tym podejściu, ale jest to jeden ze sposobów Widziałem wykorzystać zmienne zmienne.

WYŁĄCZENIE ODPOWIEDZIALNOŚCI: Nie sugeruję, że faktycznie używasz tego kodu.

+0

W rzeczywistości można pominąć dodatkowe $, jeśli używasz ciągu znaków. Nikt nigdy nie powiedział, że PHP nie jest niechlujstwem. :) –

+0

Używam ich w takim przypadku. Po pierwsze, ciąć i uciekać wszystkie dane $ _GET, $ _POST i transmisji pakietowej, a następnie używać ich. moje adresy URL są przetwarzane przez Apache w ten sposób. site.com/controller/$_GET[1]/$_GET[2]/$_GET[n] więc używanie ich jako nazw klas, funkcji lub parametrów jest super szybkie i łatwe. Byłbym wdzięczny za niektóre uwagi dotyczące używania zmiennych varianles w zakresie lub bezpieczeństwa. Podobnie jak przetwarzane są łańcuchy, jeśli są one wstawiane do kodu przed kompilatorem itp. $ class -> $ _ GET [1]; $ _GET [1] = 'knownFunction; mysql_query ('DROP *'); '; itd itd – Supernovah

9

Generalnie znajduję je w miejscach, w których kod jest zły. Może odwołuje się do statycznej zmiennej konfiguracyjnej itp. Ale dlaczego zwykła tablica asocjacyjna nie byłaby lepszym rozwiązaniem. Wygląda na to, że czeka cię luka w zabezpieczeniach.

Przypuszczam, że można ich skutecznie używać w szablonach.

7

Nigdy ich nie używaj; "tablica" jest zawsze lepszym rozwiązaniem.

+1

+1 Tak - * Dowolna * struktura danych to lepszy sposób – Dario

6

Po pierwsze, byłby to wielki problem z bezpieczeństwem, gdybyś używał danych wyjściowych użytkownika do tych celów. Wewnętrzne są jedynym ważnym zastosowaniem tutaj.

Biorąc to pod uwagę, wyobrażam sobie, że chodzi o takie rzeczy jak zapętlenie różnych zmiennych lub wysyłanie zmiennych jako parametrów.

foreach($name in array('_GET','_POST','_REQUEST')) { 
    array_map('stripslashes',$$name); 
} 
+0

Dobry przykład :) –

0

Chyba że pracujesz z wieloma zmiennymi głębokość (którego nie trzeba, jeśli nie robi się niczego wyjątkowego) będzie prawdopodobnie ich nie potrzebują. Nawet wtedy, prawdopodobnie, możesz znaleźć inny sposób, aby zapisać to samo i nadal uzyskać ten sam wynik. Może być krótszy (aw niektórych przypadkach nawet łatwiejszy do zrozumienia), aby z nich korzystać, więc z jednej strony cieszę się, że jest to część języka.

2

Nie jest niczym niezwykłym, że języki zawierają funkcje, których nie należy dotykać belkami (nawet asked a question about it chwilę temu), a zmienne zmienne są prawdopodobnie jedną z tych konstrukcji, które należą do tej kategorii. To, że język zawiera funkcję, nie oznacza, że ​​musisz jej użyć.

Mogą wystąpić sytuacje, w których rozwiązują problem (po tym, jak rekurencja jest rzadko używana w praktyce, ale nikt nie będzie twierdził, że to nie jest niezbędna konstrukcja), ale ogólnie rzecz biorąc, każda funkcja językowa zaciemniająca kod i zmienna zmienne wyzywająco mieszczą się w tej kategorii, należy je traktować z najwyższą ostrożnością.

0

Nie znalazłem wielu zastosowań zmiennych zmiennych, ale używanie zmiennych dla metod może być przydatne, o ile to, co robisz, jest jasne. Na przykład w prosty usługi REST można zrobić coś takiego:

$method = $request->getMethod(); // 'post','get','put','delete' 
try 
{ 
    $response = $resource->$method($request->getInput()); 
} 
catch (BadMethodException $badMethod) 
{ 
    $response = $responseFactory->getError($badMethod); 
} 

Niektórzy twierdzą, można to zrobić równie dobrze z switch oświadczenia (które dało), ale w ten sposób nadaje się do rozciągliwości (jeśli zdecydujesz aby dodać inny typ metody) i utrzymuje abstrakcję stosowania metody dla zasobu.

2

Znalazłem całkiem dobry ..

$php = "templates/php/default.php"; 
$html = "templates/html/default.php"; 
$css = "templates/css/default.php"; 
$js = "templates/js/default.php"; 

teraz poprosiłem użytkownikowi powiedzieć który plik chce php i/lub html ..

$userarray = array("php", "css"); 
foreach($userarray as $file){ 
    var_dump($$file); 
} 

wyjściowa:

szablony/php/default.php
szablony/css/default.php

mam sobie z tym skrzyżowane podczas próby zakresu zmiennych statycznych self::$file; tak potem przypomniałem sobie mogę używać zmiennych zmiennych self::$$file; które będą interpretowane jako self::$php;