Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Callback i pokrewne
Magan
post
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?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Nie dla statycznych tylko dla funkcji.

aby odwołać się do metody masz to:
call_user_func_array
Go to the top of the page
+Quote Post
irekk
post
Post #3





Grupa: Zarejestrowani
Postów: 64
Pomógł: 10
Dołączył: 2.08.2012
Skąd: DW

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



  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.
Go to the top of the page
+Quote Post
Magan
post
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:

  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. (IMG:style_emoticons/default/wink.gif)

Ten post edytował Magan 19.09.2014, 12:24:39
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 31.08.2025 - 20:17