Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziedziczenie obiektów
Forum PHP.pl > Forum > PHP > Object-oriented programming
SHiP
Mam mały problem z dziedziczeniem wartosci ;]

  1. <?php
  2. class other
  3. {
  4. function check()
  5. {
  6. echo 'ok<br/> ';
  7. }
  8. }
  9.  
  10. class ext extends main
  11. {
  12. public function __construct()
  13. {
  14. echo $this -> example.'<br/>'; //ok
  15. print_r($this -> myObjects); // puste?
  16. $this -> myObjects['other'] -> check(); // nie dziala :/
  17. }
  18.  
  19. public function ble()
  20. {
  21. }
  22. }
  23.  
  24. class main
  25. {
  26. public $myObjects=Array();
  27. public $example='Example text';
  28.  
  29. public function __construct()
  30. {
  31. $this -> myObjects['other'] = new other();
  32. $this -> myObjects['other'] -> check(); // ok
  33. $this -> myObjects['ext'] = new ext();
  34. }
  35. }
  36.  
  37. $mainObj = new main();
  38. ?>


Jeżeli stworzony przez obiekt klasy main obiekt klasy other zapisze w tablicy publicznej to obiekt klasy dziedziczącej tą tablice nie widzi jej elementow ;] Dlaczego?

Szukam powiązania tak aby po stworzeniu obiektów 2 klas jeden uzyskał dostęp do drugiego po przez pośrednika - klase main ;]. Próbowałem stworzyć funkcję getIterate w klasie main ;] ale chyba coś pomieszałem bo nie działało... jakieś pomysły?
NuLL
  1. <?php
  2. class other
  3. {
  4. function check()
  5. {
  6. echo 'ok<br/> ';
  7. }
  8. }
  9.  
  10. class main
  11. {
  12. public $myObjects=Array();
  13. public $example='Example text';
  14.  
  15. public function __construct()
  16. {
  17. $this -> myObjects['other'] = new other();
  18. $this -> myObjects['other'] -> check(); // ok
  19. $this -> myObjects['ext'] = new ext();
  20. }
  21. }
  22.  
  23. class ext extends main
  24. {
  25. public function __construct()
  26. {
  27. parent::__construct();
  28. echo $this -> example.'<br/>'; //ok
  29. print_r($this -> myObjects); // puste?
  30. $this -> myObjects['other'] -> check(); // nie dziala :/
  31. }
  32.  
  33. public function ble()
  34. {
  35. }
  36. }
  37.  
  38.  
  39.  
  40. $mainObj = new main();
  41. ?>

php to nie C++ - konstruktor klasy macierzystej trzeba jawnie wywolac.
SHiP
Dzięki ale nadal mam problem... w moim przypadku konstruktor tworzy 2 obiekty(w tym obiekt klasy ext) wiec jego wywołanie spod klasy ext spowoduje zapętlenie programu... Nawet jeśli wyklucze zapętlenie dodając zmienną z nazwą klasy pochodnej to pozostaje problem dostępu do pozostałych klas... w końcu nie moge za każdym razem tworzyć nowych obiektów ;]

Ok posiedziałem troche, przewertowałem przykłady z manuala i wymyśliłem winksmiley.jpg
  1. <?php
  2.  
  3. class other
  4. {
  5. function check()
  6. {
  7. echo 'ok<br/> ';
  8. }
  9. }
  10.  
  11. class main
  12. {
  13. static $myObjects=Array();
  14. public $example='Example text';
  15.  
  16. public function __construct()
  17. {
  18. $this -> myObjects['other'] = new other();
  19. }
  20.  
  21. public function run()
  22. {
  23. echo "bezposrednio: ";
  24. print_r($this -> myObjects);
  25. echo "<br/><Br/>";
  26. $this -> myObjects['ext'] = new ext($this);
  27. }
  28. }
  29.  
  30. class ext
  31. {
  32. var $parentNode;
  33.  
  34. public function __construct(&$parent)
  35. {
  36.  $this -> parentNode = & $parent;
  37. echo "wewnatrz<br/>=============<br/>";
  38.  print_r($this -> parentNode);
  39.  
  40.  print_r($this -> parentNode ->myObjects);
  41. echo "==============<br/>";
  42. // print_r($this -> myObjects); // puste?
  43. $this -> parentNode -> myObjects['other'] -> check(); // dziala :)
  44. }
  45.  
  46. }
  47.  
  48.  
  49. echo "<pre>";
  50. $mainObj = new main();
  51. $mainObj -> run();
  52. $mainObj -> myObjects['other'] -> check(); // ok
  53. ?>
splatch
Temat jest mylny. Myślę, że lepiej będzie wyglądał "Dziedziczenie, polimorfizm a konstruktory".

Co do zapętlenia całości - myślę, że to już raczej Twój błąd projektowy, który powinieneś naprawić zmieniając zależności.
bigZbig
@SHiP - nie wiem dokladnie co Ty chcesz osiągnąc dlatego pozwole sobie zgadywać.

Mysle, ze Twoim rozwiązaniem będzie wzorzec Obserwator.
SHiP
Obserwator jak najbardziej pasuje... Chodziło mi o wzorzec w którym główna klasa tworzy obiekty i posredniczy w dostepie do nich np.

glowna klasa controller tworzy klasy -> class1, class2

klasy class1 i class2 nie mają bezpośredniego dostępu mogą sie odwołac do kontrolera a on moze odwołać sie do innej klasy. W ten sposob utrzymuje ład i porządek, moduły są wzajemnie chronione a klasa controller moze dodatkowo zarządzać uprawnieniami oraz jak w obserwatorze powiadamiać wszystkie obiekty o jakichs zmianach...

Moj wczesniejszykod php(ten z 3 postu) ;]
bigZbig
Musisz zmiksowac pewne rozwiazania. Jesli Twoj kontroler ma towrzyc obiekty innych klas to na mysl przychodzi wzorzec budowniczego. Wzorca obserwatora nie da sie u Ciebie zastosowac w klasyczny sposob poniewac jak rozumiem obiekty bedą oddzialywac na siebie na wzajem.

Pisalem kiedys cos takiego. Moj kontroler (menadzer) mial wlasciwosc statyczna, ktora byl obiekt implementujacy interfejs SplSubject (zobacz rozszerzenie SPL dla php) i sluzyl on przede wszystkim jako rejestr obiektow, ktore sie na wzajem obserwowaly - (implementowaly interfejs SplObserver).

Jesli w jednym obiekcie zaszla zmiana wywolywana byla wybrana metoda statyczna kontrolera ktory wykonywal metode notify Subjecta informujac w ten sposob pozostale zarejestrowane obiekty o tym, ze w jednym z nich zaszla zamiana. Oczywiscie wywolanie metody notify u Subiecta jest rownoznaczne z wywolaniem metody update u Obserwatora. U mnie metoda update pobierala potrzebne informacje nie z obiektu subiekta przekazanego jako parametr metody update, ale z kontrolera poprzez wywolanie stosownej statycznej metody. Kontroler mial tylko statyczne wlasciwosci i metody.

Tak to w wielkim skrocie dzialalo dla uproszczenia.
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-2025 Invision Power Services, Inc.