Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmienna referencyjna dostępna w całej klasie
Forum PHP.pl > Forum > PHP > Object-oriented programming
lol75
Cześć.
Mam taki problem: Powiedzmy, że mam dwie klasy. Jeśli chcę w drugiej klasie używać metod z klasy pierwszej, muszę zrobić najpierw zmienną referecyjną wskazującą na obiekt klasy pierwszej.
Ale niestety muszę tak robić w każdej nowej metodzie (jak w nowej metodzie nie zrobię obiektu, nie mogę w niej używać metod klasy pierwszej).

I końcem końców muszę powielać we wszystkich nowych metodach instrukcję
  1. $obiektKlasyPierwszej = new pierwsza();


Ilustracja problemu:

  1. class pierwsza
  2. {
  3. public function metodaPierwsza()
  4. {
  5. echo 'Test';
  6. }
  7. }
  8.  
  9. class druga
  10. {
  11. public function metodaPierwszaKlasaDwa()
  12. {
  13. $obiektKlasyPierwszej = new pierwsza();
  14. echo 'Test';
  15. }
  16.  
  17. public function metodaDrugaKlasaDwa()
  18. {
  19. $obiektKlasyPierwszej = new pierwsza();
  20. echo 'Test';
  21. }
  22.  


Jak zrobić zmienną referencyjną dostępną w całej klasie?
Sephirus
ojojoj kłaniają się podstawy PO

Nie będę Ci pisał kodu ale nakieruje.

Droga standardowa
1. Utwórz konstruktor w klasie drugiej
2. Utwórz własność prywatną "$pierwszaKlasa" w klasie drugiej
3. W konstruktorze klasy drugiej wrzuć pod wspomnianą własność nowy obiekt klasy pierwszej
4. W metodach odwołuj się do tej własności gdy chcesz coś robić na obiekcie klasy pierwszek

Droga DI:
1. Utwórz konstruktor w klasie drugiej z jednym argumentem
2. Utwórz własność prywatną "$pierwszaKlasa" w klasie drugiej
3. W konstruktorze klasy drugiej wrzuć pod wspomnianą własność obiekt przekazany jako argument (przekażesz tu obiekt klasy pierwszej)
4. W metodach odwołuj się do tej własności gdy chcesz coś robić na obiekcie klasy pierwszek

Ogólnie:

Poczytaj o programowaniu obiektowym w PHP smile.gif
lol75
Kurcze, nie działa mi (nie mogę używać metod klasy pierwszej w klasie drugiej, pomimo zrobienia twoich zaleceń)

  1. class pierwsza
  2. {
  3. public function metodaPierwsza()
  4. {
  5. echo 'Test';
  6. }
  7. }
  8.  
  9. class druga
  10. {
  11. private $pierwszaKlasa;
  12.  
  13. public function __construct()
  14. {
  15. $pierwszaKlasa = new pierwsza();
  16. }
  17.  
  18. public function metodaPierwszaKlasaDwa()
  19. {
  20.  
  21. $pierwszaKlasa->
  22. }
  23.  
  24. public function metodaDrugaKlasaDwa()
  25. {
  26. echo 'Test';
  27. }
  28.  
  29. }


Aha - co oznacza DI?
Crozin
Dependency Injection - jedno z najbardziej podstawowych zagadnień OOP.
nospor
Cytat
Kurcze, nie działa mi (nie mogę używać metod klasy pierwszej w klasie drugiej, pomimo zrobienia twoich zaleceń)
Kurcze, no ale to są podstawy OOP... bierzesz się za to a nie wiesz co to $this i w jakim celu się tego używa? Zajrzyj do manuala
Sephirus
facepalmxd.gif o kurcze tongue.gif serio - widać że zupełnie nie wiesz z czym to się je. zerknij tutaj chociażby smile.gif Programowanie obiektowe dla początkujących
lol75
OK wielkie dzięki. Działa smile.gif

  1. class druga
  2. {
  3. private $pierwszaKlasa;
  4.  
  5. public function __construct()
  6. {
  7. $this->pierwszaKlasa = new pierwsza();
  8. }
  9.  
  10. public function metodaPierwszaKlasaDwa()
  11. {
  12.  
  13. $this->pierwszaKlasa->metodaPierwsza();
  14. }
  15.  
  16. public function metodaDrugaKlasaDwa()
  17. {
  18. echo 'Test';
  19. }
  20.  
  21. }
mstraczkowski
Ja podam jeszcze kod do rozwiązania drugiego podanego przez kolegę @Sephirus
Być może komuś się przyda.

  1. class SecondClass
  2. {
  3. protected $first = null;
  4.  
  5. public function __construct(FirstClass $first)
  6. {
  7. $this->first = $first;
  8. }
  9.  
  10. public function doingSomething()
  11. {
  12. // Calling method from FirstClass
  13. $this->getFirstClass()->doSomething();
  14. }
  15.  
  16. public function getFirstClass()
  17. {
  18. return $this->first;
  19. }
  20. }
  21.  
  22. $second = new SecondClass(new FirstClass());
  23. $second->doingSomething();

Lub rozwiązanie alternatywne (gdy klasa druga opcjonalnie potrzebuje klasy pierwszej (nie koniecznie jej wymaga))

  1. class SecondClass
  2. {
  3. protected $first = null;
  4.  
  5. public function setFirstClass(FirstClass $first)
  6. {
  7. $this->first = $first;
  8. }
  9.  
  10. public function doingSomething()
  11. {
  12. // Using FirstClass if defined
  13. if ($this->getFirstClass() !== null) {
  14. return $this->getFirstClass()->onePlusOne();
  15. }
  16.  
  17. // When FirstClass wasn't set
  18. return 1 + 1;
  19. }
  20. public function getFirstClass()
  21. {
  22. return $this->first;
  23. }
  24. }
  25.  
  26. $second = new SecondClass();
  27. $second->doingSomething();
  28.  
  29. $second->setFirstClass(new FirstClass());
  30. $second->doingSomething();
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.