Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Widzialne zmiany wprowadzone z innego obiektu
mrKrecik
post 6.01.2007, 17:37:59
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 9.05.2005

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


Witam. smile.gif
Od niedawna mam pewien problem. Otóż załóżmy, że mamy klasy a, b i c.
Klasa c to klasa główna która po kolei tworzy obiekty a i b.
Klasa a dziedziczy klasę c i np. definiuje: $this -> foo = 'bar';
Klasa b również dziedziczy klasę c i wyświetla na ekranie $this -> foo;
Niestety na ekranie nie pokazuje się 'boo'. :/

Mniej więcej tak by to wyglądało:
  1. <?php
  2. class a extends c
  3. {
  4. public funcion __construct()
  5. {
  6. $this -> foo = 'bar';
  7. }
  8. }
  9.  
  10. class b extends c
  11. {
  12. public funcion __construct()
  13. {
  14. echo $this -> foo;
  15. }
  16. }
  17.  
  18. class c
  19. {
  20. public $foo;
  21. public funcion __construct()
  22. {
  23. new a;
  24. new b;
  25. }
  26. }
  27. ?>


Mógłby ktoś powiedzieć w czym jest problem oraz ew. jak go rozwiązać?

z góry dziękuję za odpowiedzi.
pozdrawiam
mrKrecik

Ten post edytował mrKrecik 6.01.2007, 17:38:29
Go to the top of the page
+Quote Post
cadavre
post 6.01.2007, 18:33:12
Post #2





Grupa: Zarejestrowani
Postów: 472
Pomógł: 7
Dołączył: 7.12.2005
Skąd: Gliwice

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


Zazwyczaj jeśli tworzysz extenda danej klasy to wywołujesz tą klasę, która extenduje a nie jest extendowana. $foo nie będzie widoczna w klasie c.

Nie możesz wywoływać obiektu poprzez new c; (to już poza klasami - w pliku), a tak zapewne robisz.


--------------------
Silesian PHP User Group - www.spug.pl
Symfony2, OAuth2, budowanie API - masz pytania? Pisz!
Go to the top of the page
+Quote Post
mrKrecik
post 6.01.2007, 19:03:02
Post #3





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 9.05.2005

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


Eee... :/
No bo sobie napisałem silnik (klasa c), który następnie ściąga sobie różne biblioteki jak mysql, smarty itp. (klasa a), a następnie ładuje moduł, który odpowiedzialny jest za wyświetlenie czegoś na stronie (klasa B). :/

W takim razie jak to mogę rozwiązać?

Ten post edytował mrKrecik 6.01.2007, 19:04:21
Go to the top of the page
+Quote Post
DeyV
post 6.01.2007, 23:12:22
Post #4





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Niestety - ale nie zrozumiałeś podstawowego założenia, jakie przyświeca programowaniu obiektowemu.

Wyobraź to sobie na przykładzie.

Klasa C to Krzesło (schemat krzesła)
Klasa A to KrzesłoDrewniane (projekt, jak je wykonać)
Klasa B to KrzesloMetalowe ( -||- )

Stolarz tworzy krzesło drewniane, na podstawie A, a DOPIERO potem maluje je na zielono.

Ślusarz produkuje krzesło metalowe, na podstawie B, a potem dziwi się, dlaczego nie są one od razu pomalowane. Nie sądzisz, że byłoby to nieco dziwne?

W twoim przypadku tak wygląda sytuacja z Foo, niezależnie od tego, że taki zapis nie jest zalecany (tego typu rekurencja wydaje się wręcz zupełnie absurdalna, jeśli nie błędna)


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
mrKrecik
post 7.01.2007, 12:31:17
Post #5





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 9.05.2005

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


No tak - masz rację. :/
Ale w takim razie na jakiej zasadzie by to rozwiązać? Bo ok - z tym Foo to może przesada, ale ...
Czy taka konstrukcja silnika jest dobra? Tzn. jest główna klasa silnika, która ładuje odpowiednie biblioteki (mysql, smarty itp.) oraz moduł, który jest odpowiedzialny za daną podstronę. A tak dokładnie to te biblioteki są ładowane dopiero w module (bo np. nie zawsze jest potrzebny mysql) poprzez metody zawarte w głównej klasie (loadLib()winksmiley.jpg. smile.gif

pozdrawiam
mrKrecik
Go to the top of the page
+Quote Post
DeyV
post 9.01.2007, 16:36:11
Post #6





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




poczytaj o Singleton'ie


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
mrKrecik
post 9.01.2007, 20:35:11
Post #7





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 9.05.2005

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


Nom niby wiem co to singleton, ale nie wiem jak to wykorzystać w moim problemie. worriedsmiley.gif
Go to the top of the page
+Quote Post
Athlan
post 17.01.2007, 07:58:31
Post #8





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Cytat
Nom niby wiem co to singleton, ale nie wiem jak to wykorzystać w moim problemie.


Są przynajmniej 2 sposoby. Do Twojego bardziej pasuje Registry:
http://forum.php.pl/index.php?s=&showt...st&p=325122
Ale nie jest błędem użyć zwykłego singletona - ta sama zasada:
http://webcity.pl/webcity/artykuly.php/t/62
Jeżeli wybierzesz singleton, wypadałoby aby klasa A otrzymała nowy atrybut protected static $_oSingleton = null; oraz metodę protected __construct() i jakąś do zwrócenia singletona.

Zastosowanie...
  1. <?php
  2. // ...
  3. protected static $_oInstance = null;
  4. // ...
  5. public static function run()
  6. {
  7. if(!(self::$_oInstance instanceof self))
  8. self::$_oInstance = new self;
  9.  
  10. return self::$_oInstance;
  11. }
  12. // ...
  13. ?>


Ważnym działaniem jest instrukcja warunkowa w metodzie Run().

Pozdrawiam, Athlan smile.gif


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
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: 13.08.2025 - 22:53