Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> metoda wywoływana przed każdą metodą
sazian
post
Post #1





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


Witam,
wiem że temat brzmi w sposób nieco zagmatwany ale nie wiedziałem jak to inaczej nazwać.
O co chodzi postaram się wyjaśnić na przykładzie
  1. class klasa
  2. {
  3. public function before()
  4. {
  5.  
  6. }
  7. public function a()
  8. {
  9.  
  10. }
  11.  
  12. }
  13. $o = new klasa();
  14. $o->a();


czy istnieje możliwość aby przed wywołaniem metody "a" została niejawnie wywołana metoda "before" czyli kolejność wywołania wyglądała by tak before => a

idąc dalej,
  1. class klasa
  2. {
  3. public function before()
  4. {
  5.  
  6. }
  7. public function a()
  8. {
  9. $this->b();
  10. }
  11. public function b()
  12. {
  13.  
  14. }
  15.  
  16.  
  17. }
  18.  
  19. $o = new klasa();
  20. $o->a();


i tu kolejność wywołań miała by wyglądać tak before => a => before => b. A idąc jeszcze dalej, czy metoda before może być informowana jaka metoda będzie wywołana po niej?

jedyne co przychodzi mi do głowy to jakaś metoda call która przyjmie jako parametry nazwę metody i jej parametry ale takie rozwiązanie nie jest automatyczne i jeśli "się zapomni" użyć call to before nie będzie wywołany ;/

czy zrobienie czegoś takiego jest możliwe ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
adbacz
post
Post #2





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

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


Z puktu widzenia PHP się nie da. Musiałbyś napisać klasę do zarządzania obiektem, któremu dawałbyś obiekt i nazwę metody, a on by uruchomił najpierw before() a później tą metodę, którą chcesz. Nie widze innego wyjścia, bo PHP sam w sobie nie daje takiej możliwości - no chyba daje, to niech ktoś mnie oświeci.

Z tą metodą call możesz popróbować tak, że każdą metodę będziesz nazywał na przykład __MyMethod(), ale metode obiektu będziesz wywoływał MyMethod(). W tedy wykona się metoda __call(), w której już sobie będziesz robił to co potrzebujesz, czyli na przykład:

  1. class klasa {
  2. public function __call($name, $params)
  3. {
  4. $name = str_replace('__', '', $name);
  5. $this->before(); //Tutaj możesz przesyłać jako jej parametr nazwę metody, którą uruchamiasz, lub zapisać nazwę we właściwości klasy.
  6. return call_user_func_array(array($this, $name), $params);
  7. }
  8. }


Oczywiście to kod "pisany na kolanie", ale powinno działać w Twoim przypadku. Minusem tego, jest fakt, że metodę __call() musiałbyś podawać za każdym razem do klasy, która ma działać w ten sam sposób - chyba, że załątwisz do dziedziczeniem.

Plusem napisania klasy do zarządzania obiektami, jak napisałem wcześniej, jest to, że prawie o nic nie musisz się martwić. Klasa nie musi posiadać metody before() ponieważ, możesz sprawdać istnienie tej metody w klasie do zarządzania obiektami. problemem może być fakt, że wywołanie takiej metody może być troszke dłuższe:

  1. $classManag = new ClassManag(new Klasa);
  2. $returnedValue = $classManag->call('a');
Go to the top of the page
+Quote Post

Posty w temacie


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: 7.10.2025 - 01:26