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?