Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jaka klasa wywołuje daną metodę?
bmL
post 15.04.2010, 16:28:42
Post #1





Grupa: Zarejestrowani
Postów: 301
Pomógł: 25
Dołączył: 15.07.2007
Skąd: Olsztyn

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


Ciężko mi było zatytułować temat w kilku słowach. Tak więc: Czy da się sprawdzić wewnątrz tworzonego obiektu jaki obiekt go wywołał i czy w ogóle jest wywoływany z wnętrza jakiegoś obiektu (dokładniej to chcę sprawdzić czy obiekt przez który jest wywołany dziedziczy po danej klasie). Mam takie rozwiązanie:
  1. abstract class A {
  2.  
  3. }
  4.  
  5. class B extends A{
  6. __construct(){
  7. $c = c::getInstance($this); // OK
  8. }
  9. }
  10.  
  11. class C {
  12. public static function getInstance($caller)
  13. {
  14. if(!is_object($caller) || get_parent_name($caller) != A)
  15. die('ERROR');
  16.  
  17. if (!isset(self::$instance))
  18. {
  19. $c = __CLASS__;
  20. self::$instance = new $c;
  21. }
  22. return self::$instance;
  23. }
  24. }
  25.  
  26. class D {
  27. __construct()
  28. {
  29. $b = new B;
  30. $c = c::getInstance($b); // nie chcę żeby to działało ale zadziała
  31. }
  32. }

Gdyby nie obejście użyte w klasie D to wszystko by było ok ale takie coś pozwala obejść zabezpieczenie. Czy da się w jakiś sposób sprawdzić skąd została wywołana dana metoda?


--------------------
Tutaj miał być jakiś mądry tekst. Miał być... No ale jest głupi tekst.
Go to the top of the page
+Quote Post
Crozin
post 15.04.2010, 16:36:03
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


  1. if (!$caller instanceof A) {
  2. // ...
  3. }
Go to the top of the page
+Quote Post
bmL
post 15.04.2010, 16:41:45
Post #3





Grupa: Zarejestrowani
Postów: 301
Pomógł: 25
Dołączył: 15.07.2007
Skąd: Olsztyn

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


to samo robi
  1. if(!is_object($caller) || get_parent_name($caller) != A)

Chodzi o to że chciałbym zrobić to bez przekazywania $this jeżeli to możliwe bo można podstawić
  1. #
  2. $b = new B;
  3. #
  4. $c = c::getInstance($b); // nie chcę żeby to działało ale zadziała

Co nie powinno być dopuszczalne. Chcę aby instancję danej klasy można było pobierać tylko z klas które dziedziczą po zdefiniowanej klasie (w moim przykładzie klasie A).


--------------------
Tutaj miał być jakiś mądry tekst. Miał być... No ale jest głupi tekst.
Go to the top of the page
+Quote Post
Crozin
post 15.04.2010, 17:55:53
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Teraz dopiero zrozumiałem o co Ci chodzi.
1) Chyba jedynie debug_backtrace pozwoli Ci coś takiego osiągnąć
2) Ale po co robić takie paskudne rzeczy?
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 18:37