![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 3.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
Próbuję napisać coś na wzór frameworka,
mam funkcję, która wywołuje: $uri[0]::$uri[1](); //np. pages::view(); jak przekazywać dodatkowe parametry? Jeśli mój url wygląda tak: pages/view/1/2 funkcja powinna wywołać: $uri[0]::$uri[1]($uri[2],$uri[3]); jak poradzić sobie ze zmienną liczbą parametrów? Do głowy przychodzi mi tylko coś takiego: $params=""; for ($q=2;$q<count($uri)-1;$q++){ $params.='$uri['.$q.'],'; } //usuwa przecinek.... no comment.... $params=strip_tags(substr($params,0,-1)); eval ('$uri[0]::$uri[1]('.$params.');'); będę wdzięczny za bezlitosną krytykę i pomysły, jak można napisać to po ludzku.... |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Podziel string po stosowanym rozdzielaczu w adresie, czyli / a co do zmiennej liczby parametrów funkcji, to jak widzę nie uważałeś podczas czytania manuala
![]() Dzięki temu możesz ręcznie odbierać tyle parametrów w funkcji ile chcesz. Taki nieco kulawy rodzaj przeciążania funkcji w PHP mających tę samą nazwę, ale inną liczbę parametrów.
Powód edycji: [thek]: @bottom: A ja Ci "synu" błogosławię żeś wybrał ścieżkę dobra. Idź i nie grzesz więcej :D
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 3.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
Faktycznie! Baran ze mnie!
Przecież gdzieś to widziałem, w którymś z tutoriali! (już biorę się za czytanie) |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Skorzystaj z ReflectionMethod. Swoją drogą nie powinieneś najprawdopodobniej korzystać tutaj z metod statycznych.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 71 Pomógł: 1 Dołączył: 3.11.2005 Ostrzeżenie: (0%) ![]() ![]() |
No, zagwozdka normalnie...
chciałbym tylko wywołać metodę z tyloma parametrami, ile mam w URI... func_get_args z tego co wiem, zwraca już istniejące argumenty. Kiedy mam w URL 2 parametry (pomijając uri[0] i [1], czyli kontroller i metodę) chciałbym wywołać funkcję podając dwa parametry, np. $uri[0]::$uri[1]($uri[2],$uri[3]), co daje, np. page::view(2,3) wtedy w kontrolerze mógłbym odwołać się prosto, np. function index($id,$page)... chodzi tylko o tą przeklętą zmieniającą się liczbę argumentów $uri[0]::$uri[1]($uri[2],$uri[3]) jeśli będę miał 1 parametr, np. pages/view/2 a funckja wywołana będzie jak wyżej, powstanie błąd "undefined index" Mógłbym ewentualnie (co chyba jest jeszcze gorszym pomysłem) podawać ciąg parametrów i zerować te, których nie ma w URL, np. pages/view/2 for($q=2;$q<count($uri)-1;$q++){ if (!isset($uri[$q]))$uri[$q]=0; } $uri[0]::$uri[1]($uri[2],$uri[3]....$uri[20]) kretyńskie, prawda? a swoją drogą, proste i bez kombinowania. Przecież nikt nie potrzebuje więcej, niż np. 5-10 parametrów w url |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Pokombinuj z func_num_args i switch. Skoro jakaś metoda obsługuje ściśle określoną liczbę parametrów maksymalnie, to brakujące musisz ustawić na elementy "neutralne" (czyli albo false, albo 0 ) by wychwycić ich brak. Jak?
Przypuśćmy możesz w funkcji maksymalnie obsłużyć 5 parametrów. Jeśli będzie ich mniejsza ilość - uzupełniasz je poprzez false, jeśli równa - ok, jeśli większa - ignorujesz te powyżej. Jak by to mogło wyglądać? Switch jest tu najważniejszy, ponieważ on modyfikuje tak listę parametrów, by uzupełnić brakujące parametry poprzez false. Zwróć uwagę na brak break aż do case 5. To ważne, ponieważ dla 5 parametrów jedynie nastąpi wyjście ze switcha. A co jeśli jest parametrów mniej, jak choćby 3? Ano tabela $args uzupełni $args[3] (4 parametr) na false i przejdzie do case 4 (dlatego brak break!) i uzupełni $args[4](5 parametr) na false oraz przejdzie do case 5 i dopiero tu wyskoczy ze switcha ![]() ![]() PS: Oczywiście uzycie switch ma sens jedynie dla małej liczby akceptowanych parametrów. Przy dużej można użyć do tego celu jak powyżej -> pętli. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
A patrzyłeś w ogóle na mój post? To podpowiem: metoda invokeArgs()
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Crozin... na nic fleksja się nie zda, skoro błąd będzie na poziomie samej funkcji wywołanej w refleksji. Skoro będzie ona przyjmowała kilka parametrów, a nie dostanie nawet jednego to co będzie? Nie widziałem by refleksja to obsługiwała poprzez uzupełnienie nie istniejących jakoś
![]()
Można też zamiast for użyć choćby Cudować można na wiele sposobów ![]() PS: Zapomniałem dodać, że 5 to oczywiście wartość jakaś dowolna, która określa liczbę parametrów funkcji. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Skoro będzie ona przyjmowała kilka parametrów, a nie dostanie nawet jednego to co będzie? To błąd będzie. A jeżeli jakiś argument ma być opcjonalny, to... niech będzie opcjonalny:
Swoją drogą, jeżeli już ma być coś uzupełniane wartościami domyślnymi (sic!) to powinny to być NULLe, nie FALSE. |
|
|
![]()
Post
#10
|
|
![]() Grupa: Developerzy Postów: 823 Pomógł: 12 Dołączył: 18.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
Ja tylko się zastanawiam, dlaczego nie użyjecie do przekazania tych parametrów jednej tablicy. Rozwiązanie jest o tyle elastyczne, że można w przyszłości oddzielić argument przekazujący parametry url'a od dodatkowych argumentów (np. flag, etc). Poza tym to nieco szybszy sposób, łatwo się na tym operuje, dane masz takie same, jak w przypadku func_get_args().
-------------------- Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 5 Dołączył: 29.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Powyższe rozwiązanie odbiera zmienną ilość argumentów, jednak problemem jest wywołanie tej funkcji z różną ilością argumentów - bo ciężko jest to już zrobić z automatu. Czy nie lepiej mając URL w postaci jak autor pisał:
zamienić to na tablicę i wywolać funkcję przetwarzającą URL? a funkcja ta przyjmowałaby zawsze tylko jeden argument, którym byłaby tablica o dowolnej ilości parametrów z URLa
Pozdrawiam, R. Ten post edytował rodia 27.12.2010, 16:11:16 -------------------- Strony internetowe http://rodia.eu
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Podejść na rozwiązane tego problemu jest masę. Najwygodniejsza jest tablica. Potem kombinowanie z func_get_args. Co do NULL bądź innych wartości to zależne to od tego co funkcja robić ma. Ja chciałem tylko zwrócić Ci Crozin uwagę, że wbijanie tam refleksji pasuje jak pięść do oka
![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 04:38 |