Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z dzidziczeniem
Forum PHP.pl > Forum > PHP
Corwin
mam problem z wywołaniem metod w klasie dziecko i po przejrzeniu 2 książek i kilku manuali i kursów nie wiem czemu tak się dzieje.

klasa rodzic
  1. <?php
  2. class uzytkownik
  3. {
  4.  //jakies zmienne
  5. public function helo(){
  6. echo "helo world";
  7. }
  8. }
  9. ?>


klasa dziecko
  1. <?php
  2. class administrator extends uzytkownik {
  3.  //jakies zmienne
  4. public function lista_admin(){
  5. echo "helo";
  6. }
  7. }
  8. ?>


obiekty tworzone są w jednym pliku
plik1.php
  1. <?php
  2. $obiekt = new uzytkownik;
  3. $admin = new administrator;
  4.  
  5. $admin  = clone $obiekt; // przypisuje zmienne do dziecka
  6.  
  7. $_SESSION['sesja_save'] = serialize($obiekt);
  8. $_SESSION['sesja_save2'] = serialize($admin);
  9. ?>


a następnie w innym odtwarzane
plik2.php
  1. <?php
  2. $obiekt = unserialize($_SESSION['sesja_save']);
  3. $admin = unserialize($_SESSION['sesja_save2']);
  4.  
  5. $admin->helo(); // działa
  6. $admin->lista_admin(); // daje komunikat "Fatal error: Call to undefined method uzytkownik::lista_admin()"
  7. ?>
kwiateusz
bo mi sie zdaje ale błąd robisz w $admin = clone $obiekt; bo zamieniasz administratora na użytkownika w czego wyniku masz tak jakbys dał do obu zmiennych new użytkownik...
nospor
Cytat
$admin = clone $obiekt; // przypisuje zmienne do dziecka
nie za bardzo czaisz co robi clone. clone klonuje ci obiekt a ty to co sklonujesz przypisujesz do $admin, nadpisujac tym samym starą zawartosc $admin. Teraz $admin nie jest juz obiektem admnistrator, ale jest obiektem uzytkownik, co tlumaczy twoj komunikat bledu
Cysiaczek
Ja mam tylko pytanie: Po co tworzysz dwa obiekty? Osobno Administrator i osobno Użytkownik - nie widzę sensu, ale może nie rozumiem kontekstu... Możesz wyjaśnić?

Pozdrawiam.
Corwin
sprawa wygląda tak, że w plik1.php zanim tworzone są obiekty dzieci są wykonywane operacje na rodzicu i jest tam trochę zmiennych a potem jak worze klasy dziecko to te zmienne znikają. Dlatego jest klon. Operacje klas dziecko wykorzystywane są dopiero w plik2.php
em1X
no dobra, wkleiles kupe kodu, nikomu sie nie bedzie chcialo tego wertowac..
jakie jest więc twoje pytanie?

nie wywolasz metody lista_admin skoro wywolujesz ją na rzecz obiektu klasy uzytkownik.
Corwin
Cytat(Cysiaczek @ 28.12.2006, 18:24:13 ) *
Ja mam tylko pytanie: Po co tworzysz dwa obiekty? Osobno Administrator i osobno Użytkownik - nie widzę sensu, ale może nie rozumiem kontekstu... Możesz wyjaśnić?

Pozdrawiam.


Ten system będzie mieć użytkowników kilku rodzai mają oni część cech i metod wspólnych, ale część nie. chciałem rozdzielić różnice i operacje bezpośrednio na danych użytkownikach po klasach dziecko a cechy wspólne trzymać w rodzicu.
Cysiaczek
W takim wypadku wg. mnie, z dziedziczeniem trafiłeś kulą w płot. Po to masz dziedziczenie, aby tworzyć specjalizacje poprzez tworzenie od razu obiektu dziecka, a nie najpierw rodzica, a potem dziecka. Jeśli jednak bardzo chcesz zachować taka strukturę, to wykonaj operacje dla rodzica w kontekście klasy, a nie obiektu. Skorzystaj z właściwości jakie dają metody i składowe statyczne. Kiedy już skonfigurujesz klasę, wyprowadź z niej obiekty dzieci. Wtedy każdy będzie mógł odczytać np. zmienne statyczne w klasie macierzystej.

Pozdrawiam.
Vertical
Cytat
sprawa wygląda tak, że w plik1.php zanim tworzone są obiekty dzieci są wykonywane operacje na rodzicu i jest tam trochę zmiennych a potem jak worze klasy dziecko to te zmienne znikają. Dlatego jest klon. Operacje klas dziecko wykorzystywane są dopiero w plik2.php

Jeśli dobrze zrozumiałem, to klonowanie nie rozwiąże problemu. Możesz zrobić albo tak:
  1. <?php
  2. $admin->zmienna = $obiekt->zmienna2
  3. ?>

Albo, jeśli te zmienne są chronione, to zrobić jakąś metodę w klasie administrator, która by robiła to, co powyżej.
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.