Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Aktualizacja wlasciwosci w dwoch obiektach
radziel
post
Post #1





Grupa: Zarejestrowani
Postów: 103
Pomógł: 0
Dołączył: 25.04.2003
Skąd: Olsztyn

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


Mam cztery klasy, jedna inicjująca, druga główna która składa się z samych właściwości, i dwie "równorzędne" bez właściwości dziedziczące wszystkie po głównej Ilustruje to poniższy kod:

  1. <?php
  2. class a
  3. { 
  4. var $objB;
  5. var $objC;
  6.  
  7. var $strB = 'Halo, halo, tu B! </br>';
  8. var $strC = 'Halo, halo, tu C! </br>';
  9. }
  10.  
  11. class run extends a
  12. {
  13. function run()
  14. {
  15. $this->objB = new b;
  16. $this->objC = new c;
  17. }
  18. }
  19.  
  20. class b extends a
  21. {
  22. function CheckStrB()
  23. {
  24. echo $this->strB;
  25. }
  26.  
  27. function checkClassC()
  28. {
  29. $this->objC->Halo();
  30. }
  31. }
  32.  
  33. class c extends a
  34. {
  35. function CheckStrC()
  36. {
  37. echo $this->strC;
  38. }
  39.  
  40. function CheckStrB()
  41. {
  42. echo $this->strB;
  43. }
  44. function Halo()
  45. {
  46. echo 'zglasza sie klasa c!'.'</br>';
  47. }
  48. }
  49.  
  50. $run = new run();
  51.  
  52. $run->objB->CheckStrB(); //output: Halo, halo, tu B!
  53. $run->objC->CheckStrC(); //output: Halo, halo, tu C!
  54.  
  55. $run -> objB -> strB = 'Halo halo, zmienione B!'.'</br>';
  56. $run -> objB -> CheckStrB(); //output: 'Halo halo, zmienione B!'
  57. $run -> objC -> CheckStrB(); //output: 'Halo, halo, tu B!' <- zostaje stara wartosc!!
  58.  
  59. $run->objC->Halo(); //output: 'zglasza sie klasa c!'
  60. $run->objB->CheckClassC(); // Fatal Error :( , powinno byc 'zglasza sie klasa c!'
  61.  
  62. ?>


No właśnie. Chcę mieć możliwość odwoływania się do klas równorzędnych z tych klas tzn. klasa równorzędna -> klasa główna -> druga klasa równorzędna -> funkcja tej klasy. (ostatnia linijka kodu). Oraz mam problem z "bierzaca aktualizacja" wlasciwosci klasy glownej tak, aby te aktualizacje byly odrazu widoczne w klasach rownorzednych niestety nie wychodzi mi to. Ma ktos pomysl jak to rozwiazac?
Na wiki.php.pl natrafiłem na wzorzec 'Obserwator'.Mysle ze tu tkwi rozwiazanie mojego problemu, ale nie moge zaimplementowac tego pod 4. Czy podarzam wogole w dobrym kierunku?
Go to the top of the page
+Quote Post
hawk
post
Post #2





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


No pewnie, że masz fatal error, bo $run->objB->objC jest niezdefiniowany.

Natomiast generalnie podążasz w złym kierunku, ponieważ ta struktura klas jest dziwna i w ogóle brzydka. Więc coś tu jest nie tak i z tego powodu nie wiem, jakie było twoje zamierzenie. Na pewno da się to lepiej zaimplementować, najlepiej z użyciem wzorców, ale co to dokładnie ma robić?
Go to the top of the page
+Quote Post
radziel
post
Post #3





Grupa: Zarejestrowani
Postów: 103
Pomógł: 0
Dołączył: 25.04.2003
Skąd: Olsztyn

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


Moje zamierzenie było nastepujace: na poczatku mialem jedna klase i wszystko wepchane do niej. Niestety z biegiem czasu rozrosła mi sie tak bardzo ze juz sie gubilem. Wiec podzielilem ja, na pare mniejszych, ale dla kazdej z nich musiałbym tworzyć taki sam oddzielny zestaw własciwości. Więc utworzyłem klasę główną która miała *same* właściwości a reszta klas po niej dziedziczyła. Dzieki temu myslalem ze problem zostal rozwiazany - wszystkie klasy maja te same wlasciwosci.

Lecz tu pojawił się problem jeżeli z poziomu w jednej klasy zmienię właściwość klasy głównej to w drugiej klasie nie mam tej wartości zmienionej lecz domyślną lub null. Jak to hm... "obejsc" aby w klasach dziedziczacych zawsze miec "zaktualizowane" dane?
Go to the top of the page
+Quote Post
ebe
post
Post #4





Grupa: Zarejestrowani
Postów: 150
Pomógł: 1
Dołączył: 23.01.2004

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


albo wlasciwosci statyczne, albo wzorzec observer. Tu odsyłam do wiki (cool (IMG:http://forum.php.pl/style_emoticons/default/cool.gif) )
Go to the top of the page
+Quote Post
hawk
post
Post #5





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


Źle podzieliłeś swoje klasy i tyle. Jeżeli dla każdej klasy pochodnej musiałeś tworzyć taki sam zestaw właściwości, to cały ten podział był zły. Klasa powinna mieć takie atrybuty, jakie są jej potrzebne do wykonywania zadania, do którego została stworzona. Jeżeli wszystkie klasy potrzebują wszystkich atrybutów, to masz tak naprawdę wielki kawał globalnego kodu poupychanego w klasy.

Nie próbuj tego obejść, bo w twojej sytuacji wielka klasa będzie lepsza. Chociaż tak naprawdę należałoby zaprojektować to od nowa...
Go to the top of the page
+Quote Post

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: 23.08.2025 - 08:53