Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Kilka blahych pytan
q.michal
post 23.03.2016, 21:01:19
Post #1





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

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


Witam,

Ostatnio napisalem kilka klasek w PHP, ktore przedstawialem w dziale Oceny. W nawiazaniu do nich mam kilka pytan do bardziej doswiadczonych PHPowcow. Przede wszystkim zastanawiam sie, czy jest sens tworzyc niezliczona ilosc przestrzeni nazw (np. osobna dla cache, osobna dla loggera)? Idac tak dalej, mozna by nawet tworzyc przestrzenie jak np: Framework\Logger, Framework\Logger\Handler, Framework\Logger\Processor. Oznacza to jednak, ze w danym namespace bedzie raptem kilka klasek. Moze wystarczy ograniczyc sie do \Framework, tak aby nazwy klas nie kolidowali ew. z innymi Frameworkami/klasami?

Druga sprawa to sposob ladowania pewnych rzeczy. Mianowicie obecnie, chcac aby to framework odpowiadal za ladowanie poszczegolnych bibliotek (np sterowniki do cache) robilem metode load() ktora jako parametr przyjmowala nazwe sterownika (np. apc). Nastepnie metoda ta ladowala pli o nazwie apc.php ze wskazanego katalogu, tym samym ladujac porzadany nas sterownik. Niemniej jednak, w sporej ilosci projektow znalezc mozna inne rozwiazanie, tj. przekazanie jako parametru juz stworzonego obiektu. Wowczas jednak, kto inny musi zaimplementowac podobny mechanizm (jezeli chce np dac uzytkownikowi mozliwosc wyboru z poziomu panelu konfiguracyjnego). Nie wie przeciez jaki sterownik bedzie uzyty przez uzytkownika, ani jaki pliczek zaladowac. Moze co najwyzej wydedukowac nazwe klasy w przestrzeni nazw \Framework\Cache\Driver\Apc. W obu przypadkach, nadal bedzie to jakas anzwa podana w zmiennej, a wiec kod bedzie wygladal podobnie, choc zaimplementowany moze byc w 2 roznych miejscach:

  1. $class = '\Framework\Cache\Driver\' . $driver_name


Tak wiec, chetnie poznam Wasze zdanie odnosnie tego problemu, oraz sposob w jaki go rozwiazujecie?

Ten post edytował q.michal 23.03.2016, 22:53:23
Go to the top of the page
+Quote Post
com
post 24.03.2016, 22:54:17
Post #2





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


nwm czy dobrze zrozumiałem ale generalnie odpowiedź się kryje znów w standardzie czyli psr-4. Poziomy w przestrzeni to twoje katalogi.

Żeby zoptymalizować autoloading robisz
Kod
$ composer dump-autoload --optimize
Go to the top of the page
+Quote Post
q.michal
post 25.03.2016, 16:56:12
Post #3





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

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


No tak tez sie spodziewalem prawde mowiac. Niemniej jednak to juz kwestia napisanai odpowiedniego autoloadera. Inna sprawa, czy jest sens tworzyc az tyle poziomow w przestrzeni nazw?

Druga rzecz z kolei, to dynamiczne ladowanie klas, co wykorzystalem np w przypadku Cache. Bez wzgledu na to czy klasa bedzie sie nazywala CacheDriverFile czy poprostu File i bedzie nalezec do przestrzeni \Framework\Cache\Driver, trzeba stworzyc instancje takiej klasy. We frameworku mozna zrobic metode, ktora oczekuje przekazani gotowego juz objektu jako parametr, co pozornie wg mnie ulatwia sprawe. Pozornie - bo na etapie pisania FW. Natomiast pozniej, przy jego wykorzystaniu trzeba i tak ten objekt trzeba utworzyc (w szczegolnosci, jezeli to docelowo admin strony/aplikacji ma wybierac gdzie bedzie zapisany cache).

Tak wiec, postanowilem to uproscic, tak aby przekazac do metody ladujacej sterownik tylko nazwe (np. file). Niemniej jednak sprowadza sie to chyba do 2 mozliwosci:
1) switch i case, co niesie za soba koniecznosc spisania wszystkich sterownikow i utrzymywania listy
2) Dopasowanie nazwy klasy do namespace, np:
  1. $classname = 'Framework\\Cache\\Driver\\' . ucfirst($driver);
  2. $obj = new $class();


Chyba, ze znacie inny sposob. Obecnie wykorzystuje opcje nr 2, ale spotkala sie ona z krytyka, wiec zaczalem sie zastanawiac czy mozna to rozwiazac w inny sposob?
Go to the top of the page
+Quote Post
viking
post 25.03.2016, 17:30:38
Post #4





Grupa: Zarejestrowani
Postów: 6 377
Pomógł: 1116
Dołączył: 30.08.2006

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


W zasadzie to komplikujesz sobie zadanie (o ile dobrze rozumiem problem). Skoro chcesz to udostepniać, czyli będzie do wczytania przez Composer, wtedy new klasa załaduje co trzeba albo sypnie błędem że nie potrafi odnaleźć pliku. Do obsłużenia przez programistę. Jeśli chcesz jakoś wybierać sterownik to powinieneś zrobić to przez fabrykę. Taki zapis z $classname.... jest trochę słaby bo wyłączasz podpowiadanie w IDE oraz możliwość łatwego stosowania ::class (np do service managera).


--------------------
Go to the top of the page
+Quote Post
q.michal
post 25.03.2016, 18:42:07
Post #5





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

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


Tak, chcialbym dac mozliwosc wyboru, ale jednoczesnie nie chcialbym utrzymywac nigdzie listy dostepnych sterownikow. W obecnej formie, wystarczy ze wrzuce nowy sterownik np Framework\Cache\Driver\Redis do pliku src/cache/driver/redis.php i jezeli ktos sprobuje wywolac loadDriver('redis'); to to bedzie od strzala dzialac.

Ten post edytował q.michal 25.03.2016, 18:45:27
Go to the top of the page
+Quote Post
com
post 25.03.2016, 21:22:27
Post #6





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


dalej nie wiem dlaczego nie chcesz skorzystać z autoloadingu composera?
Go to the top of the page
+Quote Post
q.michal
post 25.03.2016, 21:56:28
Post #7





Grupa: Zarejestrowani
Postów: 111
Pomógł: 1
Dołączył: 24.12.2013

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


Cytat(com @ 25.03.2016, 21:22:27 ) *
dalej nie wiem dlaczego nie chcesz skorzystać z autoloadingu composera?


Bez wzgledu na to czy skorzystam, to nie rozwiaze problemu. W dalszym ciagu trzeba bedzie zmatchowac nazwe sterownika z klasa. W metodzie loadDriver() nie includuje zadnych plikow. Ja tam tylko tworze objekt, a plik z klasa jest automatycznie ladowany. Rozumiem, ze moge wymienic swojego autoloadera na innego - i co dalej?
Go to the top of the page
+Quote Post
com
post 25.03.2016, 22:05:29
Post #8





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


no to tak jak sugerował viking zrób to poprzez fabryke, przykład z ZEND
http://framework.zend.com/manual/2.2/en/mo...tml#quick-start
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: 12.06.2025 - 16:00