Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Php5 dziedziczenie [extends]
Forum PHP.pl > Forum > PHP > Object-oriented programming
dzesi
Witam was czytam manual http://pl.php.net/manual/pl/language.oop5....nekudotayim.php i jeśli dobrze zrozumiłem to za kazdym razem jak chce sie odwołać lub cos przestlac z jednego konstruktora danej klasy do drugiego to musze zawsze uzywać parent ?
Nie wiem czy dobrze to wyraziłem:)
Przykład na szybko napisany
  1. <?php
  2. class dzesi
  3. {
  4. public $imie ;
  5. public $nazwisko;
  6.  
  7. function __construct($imie,$nazwisko)
  8. {
  9. $this->imie=$imie;
  10. $this->nazwisko=$nazwisko;
  11. }
  12.  
  13. function wyswietl()
  14. {  echo " klasa 1"."\n";
  15. echo "$this->imie"."\n"."$this->nazwisko"."\n";
  16. }
  17.  
  18. }
  19.  
  20.  
  21. class ophp extends dzesi 
  22. {
  23. function __construct($imie,$nazwisko)
  24. {
  25. $this->imie=$imie;
  26. $this->nazwisko=$nazwisko;
  27. parent::__construct($imie,$nazwisko);
  28. }
  29.  
  30. function xxxxxx()
  31. { echo "klasa 2 "."\n";
  32. echo $this->imie."\n".$this->nazwisko;
  33. }
  34. }
  35. $start = new ophp("Witam","O php ");
  36. $start->wyswietl();
  37. $start->xxxxxx();
  38.  
  39.  
  40. ?>

Czy zawsze przy konstruktorach uzywa sie parrent w php ? , bo w javie czegos takiego nie ma {dziwolonga:P}
sticker
Ojojoj no to Ci nie wyszło pochwalenie sie znajomością Javy, a może coś ci mówi w javie "super()"? Poza tym to co napisane jest bez sensu: po to wywołujesz konstruktor klasy bazowej (czyli owo parent) żeby już nie przypisywać jawnie zmiennych w konstruktorze klasy potomnej
  1. <?php
  2. function __construct($imie,$nazwisko)
  3. {
  4. $this->imie=$imie; //zbędne
  5. $this->nazwisko=$nazwisko; //zbędne
  6. parent::__construct($imie,$nazwisko); // to wywołuje konstruktor klasy bazowej i ustawia imie i nazwisko
  7. }
  8. ?>
nevt
Jeżeli nie wprowadzasz żadnych zmian w definicji kostruktora klasy (jak w twoim przykładzie) - to w ogóle nie musisz go definiować w klasie dziedziczącej...

czyli:
  1. <?php
  2. class a {
  3. public $x;
  4. public function __construct($x) {$this->x = $x;}
  5. }
  6.  
  7. class b extends a {
  8. public function multiple($y) {$this->x *= $y;}
  9. }
  10.  
  11. $a = new a(1);
  12. $b = new b(2);
  13.  
  14. echo "a: $a->x, b: $b->x "; //(wynik a: 1, b: 2)
  15. $b->multiple(3);
  16. echo "a: $a->x, b: $b->x "; //(wynik a: 1, b: 6)
  17. ?>


pozdrawiam.
Speedy
Ten numer z parent stosowało się w php4, gdzie konstruktor miał taką nazwę, jak klasa. Jak już przedmówca wspomniał, w php5 nie trzeba go definiować w klasach potomnych, w celu uruchomienia go.

btw. Twój kod to pół-php4 i pół-php5 tongue.gif. Nazwę konstruktora masz w konwencji php5, ale nie definiujesz obszaru działania funkcji.
dzesi
sticker dzięki ze mi o tym powiedziałaś ze w Javie jest prawie taka sama funkcja jak w php .Nie wszystko da się wiedzieć tym bardziej ze człowiek ma mało czasu i uczy sie z internetu przeważnie .dziękuje za pomoc jak będę miał jakie kol wiek pytania na pewno się zgłoszę
Black-Berry
Pozwolicie, że dołącze się do tematu bo dziwna rzecz mnie spotkała. W konstruktorze 'dziecku' chciałem wywołac konstruktor 'rodzica'.

  1. <?php
  2. public function __construct($dane)
  3. {
  4. parent::__construct($dane);
  5. }
  6. ?>

jednak jeśli zmienna przekazywana '$dane' była obiektem to wywołanie to nie działa. Czy problem leży po stronie PHP czy coś poknociłem ?

edit: sory nieważne. Mój bład. Źle miałem ustawioną widoczność w rodzicu 'private' zamiast 'protected' wstydnis.gif
phpion
Cytat(Speedy @ 10.10.2007, 01:15:47 ) *
btw. Twój kod to pół-php4 i pół-php5 tongue.gif. Nazwę konstruktora masz w konwencji php5, ale nie definiujesz obszaru działania funkcji.

Czy przypadkiem nie jest tak, że domyślnie metoda ma zasięg publiczny? W takim przypadku nie ma potrzeby (aczkolwiek ja i tak to robię) klepania "public function..." - wystarczy samo "function...".
Sedziwoj
Cytat(phpion @ 11.03.2008, 07:02:30 ) *
Czy przypadkiem nie jest tak, że domyślnie metoda ma zasięg publiczny? W takim przypadku nie ma potrzeby (aczkolwiek ja i tak to robię) klepania "public function..." - wystarczy samo "function...".


Nie musisz też robić wielu rzeczy, ale czy to znaczy że się nie powinno?
W Java jest jeszcze jeden poziom widoczności i tam się wykorzystuje 4 stany, w PHP mamy 3 więc powiedzmy jasno o który nam chodzi. Ja brak traktuję tak jakby osoba tworząca nie wiedziała, albo nie zastanawiała się nad tym.
(swego czasu mieliśmy w PHP magic_quote... też po co było się samemu męczyć z znakami ucieczki ;])
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.