![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 3.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Nurtuje mnie pewien problem odnośnie OOP. Wrzucił bym ten temat do MVC ale mojemu silnikowi daaaleeeko do MVC, jest raczej pseudo- dla tego proszę by czytać pojęcia które napisałem z przymróżeniem oka i ewentualnie poprawiać mnie na pw by tu nie śmiecić. Tak czy inaczej jest obiekt, główny obiekt który wszystkim zarządza (kontroler). Napisałem metodę dodawania klas o których informacja znajduje się w tablicy - zmiennej obiektu kontrolera. Napisałem metodę __call by w zależności od tego czy wyłowywana metoda należy do kontrolera czy do klas "dzieci" albo jest "hooked_", wywołuje ją odpowiednio przetwarzając dane/metody. Przykładowo, kontroler ładuję klasę odpowiadającą za komunikację php<=>sql (database layer). Jeśli metoda "query()" należała by do kontrolera, wystarczyło by wywołać ją "$this->query()". Jeśli była by "hooked_" należało by wpisać "$this->hooked_query()". Jeśli należy do obiektu sql, należy wpisać "$this->sql_query()", można też podpiąć pod nią hooki i zmieszać to, wpisało by się wtedy "$this->hooked_sql_query()". To tak działa pokrótce. Do rzeczy. Moim problemem jest to, jak zrobić by można było odwoływać się pomiędzy obiektami w dwie strony. Call_user_func odpada - działa tylko z metodami statycznymi. Przeszło mi przez głowę, by w każym hook'u/pluginie wpisywać global $main (bo tak się nazywa obiekt kontrolera). Nawiasem mówiąc - hooki są obiektami zawierające metody które są odpalane przed lub po hookowanej metodzie poszczególnych obiektów - kontrolera lub "dzieci" - oczywiście w tablicy trzymam czarną listę metod których nie da się hookować. I dopiero po "global $main" odwoływać się do "rodzica". Czy istnieje jakiś inny, łatwiejszy sposób, bardziej zautomatyzowany niż "global $main" lub coś co działa podobnie do call_user_func ale dla nie statycznych metod? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 64 Pomógł: 10 Dołączył: 2.08.2012 Skąd: DW Ostrzeżenie: (0%) ![]() ![]() |
chociaz lepiej by bylo setowac instancje kontrolera hookowi podczas wstrzykiwania hooka do kontrolera: (pseudokod)
dzieki czemu nie musisz przekazywac kontrolera jako argument. uzywanie globali to zaszlosc i pozostalo chyba tylko po to aby skrypty pokroju phpbb nie przeszly do lamusa. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 3.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
Ok, dziękuję za odpowiedzi. Jak to działa sprawdzę dopiero jak wrócę z pracy. Tak czy inaczej, nasuwa mi się kolejne pytanie, czy da się jakimś sposobem "wstrzyknąć" do obiektu funkcje domyślne (konkretnie chodzi o metody dla hooków) bez konieczności budowania hooków (obiektów) z "implements" lub "extends" w strukturze klasy? Na przykład podczas tworzenia obiektu (mowa o etapie $obiekt = new obiekt();" bez ingerencji w standardową strukturę klasy, czyli tak by hooki zostały w formie:
Bo problem callbacku hooków byłby rozwiązany również bez metody call_user_func_array() również dzięki powyższemu rozwiązaniu... Wtedy domyślnie na sztywno w każym hooku dodał bym __call() na sztywno który by "uglobalniał" obiekt kontrolera (global $main) i sprawdzał czy w nim jest metoda do której odwołuje się hook po sparsowaniu metody (np. przez $this->mian_MetodaKontrolera($parametry)... A kwestią wydajności obu rozwiązań zajmę się dopiero wówczas gdy wszystko będzie działać i stworzę hook do debugu/analizowania wydajności kodu. (IMG:style_emoticons/default/wink.gif) Ten post edytował Magan 19.09.2014, 12:24:39 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 31.08.2025 - 20:17 |