[PHP] Zmienne zmienne w funkcjach
Podczas dynamicznego generowania formularzy na podstawie informacji z bazy danych często przydatne jest wprowadzenie ukrytej tablicy, która zawiera nazwy interesujących nas zmiennych wykorzystanych w tymże formularzu. Przykładowo może to być coś takiego:
Pewien mały problem powstaje w przypadku, gdy powyższą linijkę będziemy chcieli użyć w funkcji. Jak wiadomo wewnątrz funkcji jeśli zmienne nie są zadeklarowane jako global to będą miały zasięg lokalny tylko wewnątrz ciała tej funkcji. Jeśli jesteśmy w stanie przewidzieć jakie zmienne chcemy wykorzystać to raczej nikt nie będzie zastanawiać się co zrobić z tym fantem. Co jednak ze zmiennymi zmiennymi? Ano to:
Po wysłaniu takiego formularza wystarczy w prosty sposób przejrzeć zawartość zmiennej $varnames i można "zaopiekować się" potrzebnymi danymi np. w taki sposób:<select name="cat24"> bla bla bla </select> <input type="hidden" name="varnames[]" value="cat24" />
$catsinfo[$dbrow['cat_id']] = array ('label' => $dbrow['label'],
'crits' => $crits, 'selection' => ${$varnames[count ($catsinfo)]});
Oczywiście ktos mógłby powiedzieć po co wymyślać ukryte zmienne jak można wykorzystać np. $_POST i też ma się dostęp do wszystkich zmiennych. Jednak nie zawsze się tak da, gdyż można potrzebować informację na temat pewnego określonego zbioru zmiennych.Pewien mały problem powstaje w przypadku, gdy powyższą linijkę będziemy chcieli użyć w funkcji. Jak wiadomo wewnątrz funkcji jeśli zmienne nie są zadeklarowane jako global to będą miały zasięg lokalny tylko wewnątrz ciała tej funkcji. Jeśli jesteśmy w stanie przewidzieć jakie zmienne chcemy wykorzystać to raczej nikt nie będzie zastanawiać się co zrobić z tym fantem. Co jednak ze zmiennymi zmiennymi? Ano to:
foreach ($varnames as $value)
global $$value;
Otóż rozwiązanie jest w sumie banalne aczkolwiek w pierwszym momencie gdy pojawił mi się ten problem to chwilę musiałem pomyśleć, żeby wymyśleć ;)
±
Komentarze do wpisu "[PHP] Zmienne zmienne w funkcjach":
Jeszcze nie ma żadnych komentarzy. Twój może być pierwszy.
Dodaj komentarz: