Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jaka klasa wywołuje daną metodę?
Forum PHP.pl > Forum > PHP > Object-oriented programming
bmL
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?
Crozin
  1. if (!$caller instanceof A) {
  2. // ...
  3. }
bmL
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).
Crozin
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?
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.