Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Widzialne zmiany wprowadzone z innego obiektu
Forum PHP.pl > Forum > PHP > Object-oriented programming
mrKrecik
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
cadavre
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.
mrKrecik
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ć?
DeyV
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)
mrKrecik
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
DeyV
poczytaj o Singleton'ie
mrKrecik
Nom niby wiem co to singleton, ale nie wiem jak to wykorzystać w moim problemie. worriedsmiley.gif
Athlan
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
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.