Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyciąganie ilości argumentów z funkcji
MWL
post
Post #1





Grupa: Zarejestrowani
Postów: 493
Pomógł: 32
Dołączył: 14.04.2008
Skąd: Lenkowski.net

Ostrzeżenie: (0%)
-----


Witam. Piszę swój autorski framework i zaprojektowałem dispatcher który za pomocą funkcji eval wykonuje akcje z kontrolera na takiej zasadzie, by w kontrolerze można było podać bezpośrednio zmienne.

Przykładowo

http://example.com/kontroler/metoda/zmienna1/zmienna2

Kontroler obsłuży to tak:

  1. (...)
  2. public function metoda($zmienna1, $zmienna2) {}
  3. (...)


Oczywiście, gdy zostanie podana większa ilość parametrów php poza zwróceniem błędu notatkowego nie zrobi nic, czyli jest ok. Problem jednak pojawia się gdy user poda mniej zmiennych, a w metodzie nie podano podstawowych wartości. Jestem leniem więc nie chce mi się co chwile pisać $zmienna1='', dlatego chciałbym w evalu, w razie nie podania wartości podać wartość pustą. Jak wyciągnąć informację o ilości zmiennych w metodzie w znośny sposób? Istnieje jakaś gotowa funkcja??
Go to the top of the page
+Quote Post
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
który za pomocą funkcji eval wykonuje akcje z kontrolera

Yhm, i po co eval? Kopiesz pod sobą dołek - takiego kodu akcelerator już Ci nie dopali (przynajmniej wg mojej wiedzy). Poza tym, otwierasz potencjalną lukę bezpieczeństwa.

Cytat
Problem jednak pojawia się gdy user poda mniej zmiennych, a w metodzie nie podano podstawowych wartości.

To ustaw sobie je na null (jak? podstawy, sprawdź w manualu), a jak już chcesz tak bardzo sprawdzać na ilości argumentów, to func_num_args.

Ale generalnie ideę masz - niestety - złą. Przejrzyj źródła frameworków MVC i zobacz, jak tam to jest skonstruowane.
Go to the top of the page
+Quote Post
MWL
post
Post #3





Grupa: Zarejestrowani
Postów: 493
Pomógł: 32
Dołączył: 14.04.2008
Skąd: Lenkowski.net

Ostrzeżenie: (0%)
-----


Wiem, jak to na ogół jest skonstruowane (to mój kolejny dispatcher, a piszę dla przyjemności). Ostatnio była to po prostu jedna tablica.

Funkcja jaką podałeś do tego o czym mówię się nie nadaje, ponieważ, jak wiesz, wybiera dane z aktywnej funkcji, a nie z podanej przez atrybut.

Cytat
Poza tym, otwierasz potencjalną lukę bezpieczeństwa.


Potencjalną luką bezpieczeństwa może być tak naprawdę wszystko. Nawet jeśli wybierał bym dane z GET'a to oczywiste że musiałbym je najpierw przefiltrować. Co oczywiście w 3 przypadkach mój frame robi automatycznie (przyjazne linki, get'y i posty). Nie rozumiem więc co może być tu przeszkodą.

A jeśli chodzi o nie odpalenie, to mylisz się. Odpali, ale z błędem (da się go wyeliminować poprzez nie wyświetlanie, ale i tak nie odpalę metody z kontrolera).

Cytat
To ustaw sobie je na null

Cytat
Jestem leniem więc nie chce mi się co chwile pisać $zmienna1=''


To oczywiste że można je ustawić na null, ale czy istnieje jakiś znośny sposób na wybranie ilości zmiennych w wybranej metodzie czy nie?

Ten post edytował MWL 15.05.2010, 19:02:59
Go to the top of the page
+Quote Post
marcio
post
Post #4





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Przekazuj argumenty jako tablica, argument bedzie jeden a w nim tablica parametrow:
  1. public function Costam(array $args = array()) { }
Go to the top of the page
+Quote Post
MWL
post
Post #5





Grupa: Zarejestrowani
Postów: 493
Pomógł: 32
Dołączył: 14.04.2008
Skąd: Lenkowski.net

Ostrzeżenie: (0%)
-----


Cytat
(to mój kolejny dispatcher, a piszę dla przyjemności). Ostatnio była to po prostu jedna tablica.

Cytat
Przekazuj argumenty jako tablica, argument bedzie jeden a w nim tablica parametrow


Zmieniłem to po to by było łatwiej i fajniej, a nie żeby było jak ostatnio (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
marcio
post
Post #6





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


@MWL wydaje mi sie ze kombinujesz troche jak kon pod gorke :] co jest nieco zbedne i komplikuje niepotrzebnie sprawe.
To ze sie nakombinujesz to nie znaczy ze kod bedzie bardziej elegancki.

Moze lepiej napisz co ci nie pasuje w pierwszym rozwiazaniu...?

U mnie poprostu mam funkcje getParams() w klasie Router'a i tyle ktora zwraca mi pierwszy argument lub cala tablice argumentow z url'a ktory moze wygladac jak twoj lub inaczej.
Go to the top of the page
+Quote Post
erix
post
Post #7





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
A jeśli chodzi o nie odpalenie, to mylisz się. Odpali, ale z błędem (da się go wyeliminować poprzez nie wyświetlanie, ale i tak nie odpalę metody z kontrolera).

Ekhm, czytaj uważnie: napisałem dopalenie, a nie odpalenie. W jaki sposób akcelerator (prekompilator kodu bajtowego) ma przygotować zbuforowany kod, który - w założeniu eval - może się zmieniać za każdym uruchomieniem skryptu? Jest to w wysoce niewydajne i przy nieco większym obciążeniu będą problemy.

Poza tym, korzystanie z eval jest odradzane w każdym języku programowania; myślisz, że np. dlaczego developerzy przeglądarek internetowych tak często wspominają o problemach przy pisaniu kompilatorów JIT w kontekście eval?

Cytat
U mnie poprostu mam funkcje getParams() w klasie Router'a i tyle ktora zwraca mi pierwszy argument lub cala tablice argumentow z url'a ktory moze wygladac jak twoj lub inaczej.

Też bym obstawał za podobną opcją. Ale najlepiej zobacz w jakimś frameworku, bo takie kombinowanie z parametrami, jakie jest u Ciebie, to trochę jak uderzanie młotkiem o kant kuli.
Go to the top of the page
+Quote Post
nemis
post
Post #8





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 18.07.2007

Ostrzeżenie: (0%)
-----


Zdecydowanie wybrać rozwiązanie oparte na tablicy. Spróbuj pokombinować też z __call.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.09.2025 - 22:06