Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Współpraca pomiędzy modułami, Np. MySQLi z innymi
pp-layouts
post
Post #1





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 28.09.2007
Skąd: Gdynia

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


Witam. Nie jestem pewien, czy tego już gdzieś nie było, ale nie wydaje mi się. IMHO PHP ma pewną nieprzyjemną cechę. Dotyczy ona współpracy pomiędzy obiektami. Tworzę duży kod, składający się z pewnej ilości modułów. Moduł mogę stworzyć jako standardowy obiekt, czyli klasę i jej instancję. Instancja klasy jest zmienną, jeśli chcę wykorzystania jej przez różne moduły - muszę albo używać zmiennej globalnej i we wszystkich metodach innych modułów pisać milion razy "global $module" albo, co jeszcze brzdsze, odwoływać się do niej per $GLOBALS['module']. Nie podoba mi się to, tym bardziej, że do moich modułów pasuje dobrze wzorzec projektowy singletona. Realizuję go poprzez klasę statyczną. Współpraca pomiędzy takimi modułami jest praktycznie "bezszwowa". Wszystko działa idealnie, zero problemów, kod jest bardzo prosty w utrzymaniu i debugowaniu. Struktura logiczna i przejrzysta. Klasy są superglobalne i cześć. Mam np modulik XHTML, którego działania można domyśleć się z nazwy. Instancje czegoś takiego wydają mi się doskonale zbędne. Tak samo jak moduł bazy danych - kiedy aplikacja używa tylko jednej bazy.

Mam jakiś serwis/aplikację, wszystko siedzi w bazie, potrzebuję odwołać się do niej, a odwołują się do niej różne moduły - robią to w stylu "db::query('....')".

W środku mojego modułu siedzi stary, pocziwy, proceduralny mysql_. Przyjrzałem się dokumentacji obiektowego MySQLi i doszło do mnie, że chyba robiłem wszystko nie tak - MySQLi jest na tyle dobry i elegancki, że można go używać bezpośrednio, bez żadnego spowalniającego i zamulającego dodatkowego "międzymordzia". Pomyślałem o wywaleniu mojego liba od bazy do kosza i przerzucenie się na wbudowane w PHP MySQLi, ale nagle przypomniałem sobie o starym problemie.

Zmienne globalne. Prawdziwa PITA. Jest sposób żeby to jakoś obejść? Czy ktoś zna jakiś prosty, szybki i elegancki sposób, żeby używać obiektów wewnątrz innych obiektów nie pisząc milion razy global albo $GLOBALS ? Wykombinowałem trochę hackerskich sztuczek, ale co było do przewidzenia, Eclipse (czy Zend Studio for Eclipse) nie łapie tego i nie wyświetla podpowiedzi dla przekombinowanych obiektów. A bez tego jak bez ręki - jak mam w kodzie kilkanaście lub nawet kilkadziesiąt modułów, każdy z nich ma po kilkadziesiąt zmienych i metod - dopełnianie kodu (podpowiedzi edytora) to jedyny sposób żeby nad tym bajzlem zapanować.

Czy w świetle tego, statyczne międzymordzie jako nakładka na MySQL(i) pozostaje optymalnym wyjściem, czy można zrobić to inaczej, prościej i szybciej? Chciałbym uniknąć za wszelką cenę wyważania otwartych drzwi czy komplikowania prostych rzeczy. Potrzebuję optymalnego sposobu. Ma ktoś jakiś pomysł? Może w praktyce wpadliście na coś lepszego?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
LBO
post
Post #2





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Rozwiązaniem jest wzorzec o nazwie Dependency Injection i było już o tym na forum kilka razy. Pobieżnie omówione jest tutaj i tutaj
Go to the top of the page
+Quote Post
pp-layouts
post
Post #3





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 28.09.2007
Skąd: Gdynia

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


LBO, jesteś MASTAH! Pewnie trochę mi zajmie przerobienie istniejącego kodu, ale warto. Dzięki.
Go to the top of the page
+Quote Post
drPayton
post
Post #4





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

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


Rozszerzeniem tego jest wzorzec Registry:

Dla przykładu:

  1. <?php
  2. /**
  3.  * Set up File Helper class
  4.  */
  5. $oFileHelper = new infFileHelper;
  6. /**
  7.  * Set up registry class
  8.  */
  9. $oRegistry = new infRegistry;
  10. /**
  11.  * Register File Helper object
  12.  */
  13. $oRegistry->register('oFileHelper', $oFileHelper);
  14. ?>


I potem przekazujesz jedynie obiekt klasy Rejestru:

  1. <?php
  2. /**
  3.  * Init
  4.  */
  5. new infBase($oRegistry);
  6.  
  7.  
  8. (...)
  9.  
  10. class infBase
  11. {
  12.    public function __construct(infRegistry $oRegistry)
  13.    {
  14.        $this->oFileHelper = $oRegistry->get('oFileHelper');
  15.    }
  16. (...)
  17. ?>


A klasa rejestru to settery i gettery po prostu winksmiley.jpg

Ten post edytował drPayton 17.09.2008, 16:59:31
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 Aktualny czas: 20.08.2025 - 07:52