Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Przekazanie obiektu z jednej klasy do drugiej.
Forum PHP.pl > Forum > Przedszkole
arzach
Witam.
Napisałem takie dwie proste klasy dla testów i dla nauki. I mam pytanie do was, dlaczego to nie chce działać? Utworzyłem obiekt klasy test2 i chce go przekazać do klasy test1 i wywołać metodę z kasy test1 name()
  1. <?php
  2. class test1
  3. {
  4. public function name()
  5. {
  6. return 'Tomek';
  7. }
  8. }
  9.  
  10. class test2
  11. {
  12. public function obiekt(test1 $obj)
  13. {
  14. return $obj->name();
  15. }
  16. }
  17.  
  18. $obiekt = new test2();
  19. $obiekt->objekt($obiekt);
slightyboy
Nie działa, bo kod jest zły. Wywołanie powinno wyglądać tak:
  1. $obiekt = new test2();
  2. var_dump( $obiekt->obiekt(new test1()) );
arzach
Dziękuje działa.
Teraz mam pytanie chciałbym utworzyć obiekt już w klasie a nie po utworzeniu obiektu i przekazaniu go. Czyli napisałem takie coś i nie działa. Proszę o wskazówki.
  1. <?php
  2. class test1
  3. {
  4. public function name()
  5. {
  6. return 'Tomek';
  7. }
  8. }
  9.  
  10. class test2
  11. {
  12. public $obiekt;
  13.  
  14. public function utworz_obiekt()
  15. {
  16. $obiekt = new test1();
  17. $this->obiekt = $obiekt;
  18. }
  19.  
  20. public function obiekt(test1 $obiekt)
  21. {
  22. return $obiekt->name();
  23. }
  24. }
  25.  
  26. $obiekt = new test2();
  27. $obiekt->utworz_obiekt();
  28. echo $obiekt->obiekt();
slightyboy
Poprawny kod powinien wyglądać tak (poprawka metody test2::obiekt()):
  1. public function obiekt(test1 $obiekt)
  2. {
  3. return $this->obiekt->name();
  4. }
Z kolei w test2::utworz_obiekt() nie ma potrzeby przypisywania nowej instancji do zmiennej, wystarczy:
  1. $this->obiekt = new test1;
Przeanalizuj to co przed momentem napisałem, bo popełniasz podstawowe błędy na poziomie logiki (odwołujesz się do zmiennych/obiektów, których nie zadeklarowałeś). smile.gif
arzach
Zrobiłem tak jak mówisz i nie działa. Nie przypisuje nowej instancji w metodzie obiekt i nie ma pojęcia, dla czego.
  1. <?php
  2. class test1
  3. {
  4. public function name()
  5. {
  6. return 'Tomek';
  7. }
  8. }
  9.  
  10. class test2
  11. {
  12. public $obiekt;
  13.  
  14. public function utworz_obiekt()
  15. {
  16. $this->obiekt = new test1();
  17. }
  18.  
  19. public function obiekt(test1 $obiekt)
  20. {
  21. return $this->obiekt->name();
  22. }
  23. }
  24.  
  25. $obiekt = new test2();
  26. $obiekt->utworz_obiekt();
  27. echo $obiekt->obiekt();
bastard13
Po pierwsze dopisz sobie na początku skryptu error_reporting(E_ALL) i napisz czy ci skrypt wyrzuca błędy po wykonaniu.
Po drugie deklarujesz funkcję z argumentem:
  1. public function obiekt(test1 $obiekt)

A wywołujesz bez argumentu:
  1. echo $obiekt->obiekt();
arzach
Cytat(bastard13 @ 24.07.2010, 15:24:26 ) *
A wywołujesz bez argumentu:
  1. echo $obiekt->obiekt();


No tak ale ten argument bierze się z metody utworz_obiekt która tworzy obiekt klasy test1. Dostaje komunikat
Kod
Catchable fatal error: Argument 1 passed to test2::obiekt() must be an instance of test1, none given, called in C:\Program Files\WebServ\httpd-users\klasy2\obiekty.php on line 29 and defined in C:\Program Files\WebServ\httpd-users\klasy2\obiekty.php on line 21


I nie wiem czemu przecież obiekt klasy test1 jest utworzony w metodzie otworz_obiekt


piku235
Jeżeli chcesz coś podać bez wpisywaniu wartości do metody, która posiada zdefiniowane argumenty to do każdego argumentu przypisujesz wartość null np.
  1. public function obiekt(test1 $obiekt = null)

A tak wogule to
  1. public function obiekt(test1 $obiekt)
powinieneś dać bez żadnych argumentów, bo klase test1 jak widzę jest już zapisana w zmiennej klasy test2 po wykonaniu metody utworz_obiekt(), więc wystarczy, że dasz
  1. public function obiekt()
arzach
Poradziłem sobie zrobiłem tak i działa.
  1. <?php
  2.  
  3. class test1
  4. {
  5. public function name()
  6. {
  7. return 'Tomek';
  8. }
  9. }
  10.  
  11. class test2
  12. {
  13. public $obiekt; // przechowuje obiekt klasy test1()
  14.  
  15. public function obiekt(test1 $obiekt)
  16. {
  17. return $obiekt->name();
  18. }
  19.  
  20. public function utworz_obiekt()
  21. {
  22. $this->obiekt = new test1();
  23. return $this->obiekt($this->obiekt);
  24. }
  25.  
  26. }
  27.  
  28. $obiekt = new test2();
  29. echo $obiekt->utworz_obiekt();
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.