Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyciąganie ilości argumentów z funkcji
Forum PHP.pl > Forum > PHP
MWL
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??
erix
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.
MWL
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?
marcio
Przekazuj argumenty jako tablica, argument bedzie jeden a w nim tablica parametrow:
  1. public function Costam(array $args = array()) { }
MWL
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 winksmiley.jpg
marcio
@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.
erix
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.
nemis
Zdecydowanie wybrać rozwiązanie oparte na tablicy. Spróbuj pokombinować też z __call.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.