Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Kilka blahych pytan
Forum PHP.pl > Forum > Przedszkole
q.michal
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?
com
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
q.michal
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?
viking
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).
q.michal
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.
com
dalej nie wiem dlaczego nie chcesz skorzystać z autoloadingu composera?
q.michal
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?
com
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
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.