Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skąd pochodzi wywołanie metody
Forum PHP.pl > Forum > PHP > Object-oriented programming
Magan
Zakładając, że jest dany obiekt z poszczególnymi metodami, czy istnieje sposób by sprawdzić w metodzie, czy metoda ta została wywołana z poza obiektu albo z obiektu?
Pyton_000
chyba tylko debug_backtrace
Kalinowcyk
Można to ewentualnie rozwiązać jawnie za pomocą parametru metody, w którym podasz, skąd ją wywołujesz.
irmidjusz
kolega Magan chyba nie chce sterować przepływem kodu w metodzie zależnie od tego, czy została wywołana z innej metody tego obiektu, bądź spoza niego? ^^ smile.gif
Magan
Właśnie tak smile.gif Chodzi o to, by metoda w obiekcie wiedziała, czy jest wykonana z poza obiektu czy z metody tego samego obiektu bądź (tutaj inna opcja) i zależnie od tego wykonać inne instrukcje. smile.gif Chyba wykorzystam sztuczkę z __call() a do kluczowych funkcji dodam preffix i już. Chyba, że ktoś znajdzie lepszy pomysł. wink.gif
Pyton_000
Zrób "fasadę" dla metody poprzez ukrycie żądanej metody poprzez private i zrobienie innej dostępowej public. W ten sposób wew. możesz korzystać z prywatnej metody a z zewnątrz poprzez "fasadę" czyli np. doAction('nazwa_metody');
irmidjusz
hehe Pyton_000 mnie ubiegł smile.gif

-------------------------------------

skoro potrzebujesz różnej logiki, to lepiej napisać więcej krótszych metod. Taki przykład: powiedzmy, że chcesz coś zrobić z otrzymanym argumentem, ale jeśli został przekazany z zewnątrz, to trzeba go najpierw zwalidować, a jeśli z innej wewnętrznej metody klasy to nie trzeba walidować, bo wtedy zawsze jest poprawny. No to tak jakoś to można zrobić:

  1. class A {
  2. public function doSomething($value) {
  3. //najpierw walidacja $value, potem przekaż do metody b() jeśli ok:
  4. $this->b($value);
  5. }
  6.  
  7. private function b($value) {
  8. //zrób coś z $value,
  9. }
  10.  
  11. private function c() {
  12. //a to jakaś inna metoda tej klasy, wywołana w jakiś sposób, także używa metody b()
  13. //ale nie trzeba robić walidacji argumentu, bo jest zawsze poprawny w tym przypadku
  14. $value = 'coś tam'; //zawsze poprawne
  15. $this->b($value);
  16. }
  17. }
  18.  
  19. class B {
  20. public function execute() {
  21. $a = new A();
  22. //a tu wywołanie "z zewnątrz"
  23. $a->doSomething('jakiś parametr');
  24. }
  25. }
Magan
Dziękuję za wskazówki. wink.gif Borykam się z systemem hooków gdzie poniekąd tej sztuczki mi trzeba. Moja idea jest następująca i raczej z niej skorzystam, może kogoś zainsteresuje i się przyda. wink.gif

  1. class main {
  2. function __construct()
  3. {
  4.  
  5. }
  6.  
  7. private function something($params)
  8. {
  9. //Metoda właściwa obiektu
  10. return $params;
  11. }
  12.  
  13. function __call($method,$params)
  14. {
  15. //Metoda magiczna odbierająca wywołania zabezpieczonych metod z poza obiektu filtrująca hooki
  16. if () { //sprawdzenie czy metoda istnieje po usunięciu z jej nazwy preffixu "hook_" lub innego (przykładowy) i wykonanie jej, pozostała walidacja
  17. if (){} //wywołanie hooku jeśli jego suffix to "_before" z parametrami metody do której się odwołuje
  18. $this->$method($params); //metoda do której odnosi się hook
  19. if (){} //wywołanie hooku jeśli jego suffix to "_after", jak z "_before"
  20. return $params;
  21. }
  22. return false;
  23. }
  24.  
  25. }
  26.  
  27. $main = new main;
  28. $main->hook_something_before($params); //ta metoda zadziała
  29. $main->something($params); //ten sposób zwróci "false"
  30. $main->nieistniejaca_metoda(); //a ten to już w ogóle


Tak to pokrótce wygląda, pisane z palca, mieć się na baczności.

PS. Przydał by się tabulator tutaj albo jestem nie uświadomiony 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-2024 Invision Power Services, Inc.