Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Niewiadoma ilość argumentów..
Cinamicom
post 18.07.2014, 07:23:12
Post #1





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


Witam. Przeglądam dokumentację Laravela, i widzę taki kod:

  1. Route::get('user/{id}/{name}', function($id, $name)
  2. {
  3. //
  4. })


Chciałem napisać podobny router, właśnie do tego Laravela, i mam problem..


Załóżmy że tutaj jest router:
  1. class Router {
  2. public static function get($path, $var) {
  3. $var();
  4. }
  5.  
  6. }


$var() - tutaj muszę podać argumenty, które przesłane zostały w function($id, $name). Nie było by problemu zwrócić coś, tylko jak mam wykryć ile zostało przesłanych argumentów?

Ten post edytował Cinamicom 18.07.2014, 07:25:07
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 17)
Pyton_000
post 18.07.2014, 07:32:21
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


http://pl1.php.net/manual/en/function.func-get-args.php
Go to the top of the page
+Quote Post
Cinamicom
post 18.07.2014, 07:38:07
Post #3





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


Do funkcji wiem jak to zastosować, ale nie wiem jak zastosować to do $var();?

Bo jeśli wlepię to do get, to to mi zwróci path, i $var. A ja potrzebuję wiedzieć, jakie zostały wysłane do $var()

Ten post edytował Cinamicom 18.07.2014, 07:48:04
Go to the top of the page
+Quote Post
Pyton_000
post 18.07.2014, 07:47:47
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Jakieś dziwne coś napisałeś...
z $var zrobiłeś wywołanie funkcji która jest pod nazwą w $var i chcesz tam przekazać jakieś argumenty z kosmosu...
Coś Ci się chyba pomieszało albo ja nie widzę drugiego dna
Go to the top of the page
+Quote Post
Cinamicom
post 18.07.2014, 08:18:10
Post #5





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


Zobacz..

  1. funkcja('Łan', function($klocek, $bobek) {
  2. echo $klocek;
  3. });
  4.  
  5. funkcja($one, $var) {
  6. $var(1, 2);
  7. }



To mi wyświetli - 1. Ale ja potrzebuję przewidzieć, ile idzie argumentów do $var. Teraz dałem dwa, $klocek i $bobek, ale jeśli dodam kolejne np. 2, wtedy do $var() muszę dodać jeszcze dwa. Ja potrzebuję do zautomatyzować. Raz idą dwa argumenty, raz idzie jeden, raz trzy.
Go to the top of the page
+Quote Post
czychacz
post 18.07.2014, 08:19:56
Post #6





Grupa: Zarejestrowani
Postów: 189
Pomógł: 13
Dołączył: 20.09.2008
Skąd: Lublin

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


http://php.net/manual/en/function.call-user-func-array.php
Go to the top of the page
+Quote Post
Cinamicom
post 18.07.2014, 08:59:17
Post #7





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


Dzięki za odp, ale tą metodę też znam.

Zalezy mi ,zeby to działało tak jak tutaj:

  1. Route::get('user/{id}/{name}', function($id, $name)
  2. {
  3. //
  4. })


Ten post edytował Cinamicom 18.07.2014, 08:59:27
Go to the top of the page
+Quote Post
czychacz
post 18.07.2014, 09:12:20
Post #8





Grupa: Zarejestrowani
Postów: 189
Pomógł: 13
Dołączył: 20.09.2008
Skąd: Lublin

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


nie mam 100% pewności, ale wg mnie to jest to samo, tylko opakowane w Route. żeby wywołać jakąś funkcję/metodę, w php nie musisz absolutnie znać ilości jej argumentów. jeśli zostanie wywołana z większą ich ilością, reszta zostanie pominięta. jeśli z mniejszą, a one nie mają domyślnych wartości, zgłoszony zostanie warning (jeśli dobrze pamiętam).

w powyższym przypadku string jest sprawdzany pod kątem istnienia zmiennych. to, że nazywają się tak samo jak w funkcji to tylko wymysł programisty, bo tak na prawdę w tym przypadku mogłyby się nazywać 'wtf' i 'wazzup'.

//edit: jeśli chciałbyś uprzeć się na jakieś bardziej precyzyjne routery, które mogą przekazywać konkretne wartości jako konkretne parametry, to nie powinieneś korzystać z zapisu, który podałeś.

Ten post edytował czychacz 18.07.2014, 09:13:59
Go to the top of the page
+Quote Post
Cinamicom
post 18.07.2014, 09:18:52
Post #9





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


Dzięki.

Chciałbym, żeby to wyglądało jak w Django, albo tutaj.

Definiuje adresy, w nich też zmienne.

Np.

/user/edit/{id}
i tu odwołanie do jakies funkcji, np. $this->userEdit($id)

Ten post edytował Cinamicom 18.07.2014, 09:33:07
Go to the top of the page
+Quote Post
czychacz
post 18.07.2014, 09:35:23
Post #10





Grupa: Zarejestrowani
Postów: 189
Pomógł: 13
Dołączył: 20.09.2008
Skąd: Lublin

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


nie korzystałem z django, ale ujmę to tak:
powinieneś stworzyć klasę routera, która analizowałaby taki string pod kątem zmiennych i zwracała do jakiejś zmiennej tablicę ze znalezionymi wartościami (oczywiście asocjacyjnie - chyba, że chcesz zrobić to tak, jak w cake, ale nie polecam). operowanie na zapisach takich, jak wspomniany przez ciebie jest mało precyzyjne. to obiekt kontrolujący requesta (w tym przypadku router) powinien odpowiednio rozdzielić żądanie - ale tutaj pojawia się problem z tym, że chcesz użyć funkcji.

funkcje nie mogą sprawdzić kluczy dla parametrów do nich przekazanych. dla nich kluczami są nazwy zmiennych, więc jeśli pojawiają się tam jakieś parametry, klucze są pobierane z deklaracji nagłówka funkcji i można używać ich jako zmienne.
dlatego odwołanie, o jakim wspominasz ($this->userEdit($id)) w sensie dosłownym nie jest możliwe.

frameworki pod tym kątem mają bardziej rozbudowaną obsługę routingu, polegającą na współpracy z obiektami routera, requesta i kontrolera inicjalizującego przekierowanie na podkontroler. w twoim przypadku powinieneś zrobić coś podobnego, ale zakładam, że korzystasz z gotowego kodu i chcesz go rozbudować a nie zmieniać.

zajrzyj do kodu jakiegoś prostego frameworka i znajdź klasę routingu. tam zobaczysz, jak to jest robione. ja ci tego nie opiszę, bo to temat-rzeka, a i tak dużo zależy od tego, z czym będą współgrać odpowiednie klasy.
Go to the top of the page
+Quote Post
Cinamicom
post 18.07.2014, 09:52:29
Post #11





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


Chcę napisać od zera. A do przeanalizowania kodu, jaki ten framework polecasz? Nie chcę krowy pokroju zenda.

W django jest coś na zasadzie takiej, napiszę to po swojemu:

urls(
"user/edit/{id}", "odpowiedni-kontroler"
)
a kontroler a parametrze odbiera sobie te id.

Ten post edytował Cinamicom 18.07.2014, 09:54:39
Go to the top of the page
+Quote Post
czychacz
post 18.07.2014, 09:55:23
Post #12





Grupa: Zarejestrowani
Postów: 189
Pomógł: 13
Dołączył: 20.09.2008
Skąd: Lublin

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


na upartego nawet cake w wersji 2. ale podejdź do jego kodu bardziej analitycznie niż kopiuj-wklej, bo kod cake (a raczej nie sam kod, ale podejście do tematów) idealny nie jest. potraktuj tamten kod jako przykład.

//edit: nie chcę podchodzić do analizy django, bo nic o nim nie wiem. wiem tylko, że osiągnięcie celu w taki sposób, o jakim pisałeś wcześniej (edit: w php), nie jest możliwe, ale jeśli pójdziesz w trochę inną stronę, to może się udać.

Ten post edytował czychacz 18.07.2014, 09:57:51
Go to the top of the page
+Quote Post
Cinamicom
post 18.07.2014, 09:59:14
Post #13





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


Szybkie spojrzenie okiem na tysiące linijek routera od cake, i zdaję sobie sprawę, jak mało wiem..

Może lepszym rozwiązaniem byłoby, użycie gotowe frameworka?

Ale ja jakoś nie lubię pisać na cudzym kodzie..

Ten post edytował Cinamicom 18.07.2014, 10:02:12
Go to the top of the page
+Quote Post
czychacz
post 18.07.2014, 10:35:56
Post #14





Grupa: Zarejestrowani
Postów: 189
Pomógł: 13
Dołączył: 20.09.2008
Skąd: Lublin

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


jeśli nie chcesz pisać w cudzym frameworku, a nie masz wiedzy odnoszącej się do konstrukcji routerów to masz wyjścia:
- przeanalizować kod routera z jakiegoś frameworka (to wyeliminowałeś)
- poczytać o działaniu routerów (google, książki)
- podejść do tego kreatywnie i samemu próbować napisać router, ale do tego potrzebna jest wiedza o PHP większa niż podstawowa

domyślam się, że pozostaje ci tylko opcja druga. zdobądź wiedzę teoretyczną z jakichś książek albo z google. popytaj o dobre książki traktujące o PHP (najlepiej z uwzględnieniem MVC, bo tam najprawdopodobniej będzie najwięcej informacji o routerach), ale nie takie z gotowymi rozwiązaniami, ale z większą ilością wiedzy teoretycznej - tylko wyjaśnienia jako przykład.

na upartego też czysto:
http://quadric.goblix.pl/programowanie/wzo...we-router-cz-1/
i części kolejne.
ewentualnie poszukaj też o innych wzorcach projektowych
Go to the top of the page
+Quote Post
Cinamicom
post 18.07.2014, 12:11:02
Post #15





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


Bardzo fajny znalazłem smile.gif

https://raw.githubusercontent.com/brandonwa.../router.lib.php
Go to the top of the page
+Quote Post
by_ikar
post 18.07.2014, 12:32:01
Post #16





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


To o czym piszesz jest funkcją anonimową. Działanie takiego routera nie jest jakieś super skomplikowane. Więc ten ciąg który jest podawany jako pierwszy argument, jest parsowany 2 razy. Raz po to żeby wydobyć z niego "zmienne" (preg_match_all), a drugi raz po to żeby stworzyć z tego ciągu wyrażenie regularne (preg_match i pewnie jakieś jeszcze funkcje). Za pierwszym razem powstaje tablica z parametrami które masz w klamrach, a za drugim razem powstaje również tablica z parametrami z wyrażenia regularnego. Następnie obie tablice są porównywane (array_filter), i tak otrzymane parametry podajesz tej funkcji anonimowej (call_user_func_array) która jest podana jako drugi parametr.

Co do pisania w "cudzym" kodzie. Kiedyś myślałem trochę podobnie, że jak przerobię router z symfony1 na swoje potrzeby to będzie DUŻO lepiej to działać niż w oryginale. Przerobić, przerobiłem. Działać, działał. Ale czy lepiej, to już nie do końca. Ale najgorsze nie było to, tylko fakt że zamiast tworzyć coś co powinienem, skupiałem się na "fundamentach" w efekcie czego, jakiekolwiek moje prace szły bardzo powoli. Jak czas ci nie straszny - baw się, twórz swoje rozwiązania. Jak jednak zależy ci na czasie, to lepiej naucz się prostego wykorzystania dostępnych narzędzi, zamiast pisać je na nowo.
Go to the top of the page
+Quote Post
Cinamicom
post 18.07.2014, 12:40:48
Post #17





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 8.07.2013

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


Cytat(by_ikar @ 18.07.2014, 13:32:01 ) *
Co do pisania w "cudzym" kodzie. Kiedyś myślałem trochę podobnie, że jak przerobię router z symfony1 na swoje potrzeby to będzie DUŻO lepiej to działać niż w oryginale. Przerobić, przerobiłem. Działać, działał. Ale czy lepiej, to już nie do końca. Ale najgorsze nie było to, tylko fakt że zamiast tworzyć coś co powinienem, skupiałem się na "fundamentach" w efekcie czego, jakiekolwiek moje prace szły bardzo powoli. Jak czas ci nie straszny - baw się, twórz swoje rozwiązania. Jak jednak zależy ci na czasie, to lepiej naucz się prostego wykorzystania dostępnych narzędzi, zamiast pisać je na nowo.



Nigdzie mi się nie śpieszy, a wole poświęcić x czasu, i napisać coś swojego. Aktualnie mam jeden taki framework, ale chciałbym napisać inny, bardziej rozbudowany.

Chociaż jak patrzę na te wszystkie frameworki, myślę sobie - nigdy nie dorównam tym frameworkom, i czy czy jest sens w takim razie, robienie czegoś gorszego?
Go to the top of the page
+Quote Post
by_ikar
post 18.07.2014, 12:57:54
Post #18





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Wiesz, w sumie to już kolejny temat na tego typu gadkę, więc zamiast przepisywać to samo, zwyczajnie zlinkuje ci swojego posta: http://forum.php.pl/index.php?showtopic=23...p;#entry1115870

Na prawdę, pobaw się jakimiś gotowymi komponentami, zepnij je w jakąś sensowną całość i masz już gotowe "swoje" środowisko.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 23:29