Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Callback i pokrewne
Forum PHP.pl > Forum > PHP > Object-oriented programming
Magan
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?
Pyton_000
Nie dla statycznych tylko dla funkcji.

aby odwołać się do metody masz to:
call_user_func_array
irekk

  1. call_user_func_array(array($hook, 'metoda'), array($controller));


chociaz lepiej by bylo setowac instancje kontrolera hookowi podczas wstrzykiwania hooka do kontrolera: (pseudokod)

  1. Controller::setHook($hook) {
  2.  
  3. $hook->setController($controller);
  4. $this->hook = $hook;
  5. }
  6.  
  7. Controller::__call($method, $arguments) {
  8.  
  9. return call_user_func_array(array($this->hook, $method), $arguments);
  10. }


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.
Magan
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:

  1. jakasKlasa {
  2. function metoda () {}
  3. }



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. wink.gif
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.