Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: 2 podobne klasy
Forum PHP.pl > Forum > PHP > Object-oriented programming
enigma
jeszcze mało miałem do czynienia z obiektami i mam problem jak zrobić dziedziczenie
załóżmy że mam 2 klasy: uczeń i nauczyciel
w każdej z tych klas będzie zmienna (tablica), konstruktor no i funkcje no i funkcje (pobierz_dane, dodaj, usuń, zmień)

jak chciałbym zrobić klasę podstawową np. osoba a uczeń i nauczyciel jako dziedziczące to
w w osoba byłyby funkcje a w uczeń i nauczyciel dziedziczyłyby te funkcje no i miały swoje konstruktory, oraz swoje tablice na dane)

no i problem jest z klasą osoba, nie bardzo wiem jak ją utworzyć

część klas bez dziedziczenia
  1. <?php
  2. class Uczeń
  3. {
  4.  $zUczenTab = array
  5.  (
  6.  'idUczen' => null,
  7. 'Klasa_idKlasa' => null,
  8. 'imie' => null,
  9. 'nazwisko' => null,
  10. 'adres' => null,
  11. 'telefon' => null,
  12. 'imie_ojca' => null,
  13. 'imie_matki' => null
  14. );
  15.  
  16. $zUczenIndeksy = 'idUczen, Klasa_idKlasa, imie, nazwisko, adres, telefon, imie_ojca, imie_matki';
  17.  
  18. function __construct($zTablica)
  19. {
  20. if(!is_array($zTablica)) return;
  21.  
  22. foreach($zTablica as $zKlucz => $zWartosc)
  23. $this -> zUczenTab[$zKlucz] = $zWartosc;
  24. }
  25.  
  26. function fPobierzDane($zWartosci, $zKryteria = null)
  27. {
  28.  //
  29. $zSQL = 'SELECT '.$zWartosci.' FROM uczen'.$zWarunek;
  30. //
  31. while($zIle--)
  32. {
  33.  //
  34. $zListaUczniow[] = new Uczeń($zDane);
  35. }
  36.  
  37. return $zListaUczniow;
  38. }
  39. }
  40. ?>


  1. <?php
  2. class Nauczyciel
  3. {
  4.  $zNauczycielTab = array
  5.  (
  6.  'idNauczyciel' => null,
  7. 'imie' => null,
  8. 'nazwisko' => null,
  9. 'telefon' => null,
  10. );
  11.  
  12. $zNauczycielIndeksy = 'idNauczyciel, imie, nazwisko, telefon';
  13.  
  14. function __construct($zTablica)
  15. {
  16. if(!is_array($zTablica)) return;
  17.  
  18. foreach($zTablica as $zKlucz => $zWartosc)
  19. $this -> zNauczycielTab[$zKlucz] = $zWartosc;
  20. }
  21.  
  22. function fPobierzDane($zWartosci, $zKryteria = null)
  23. {
  24.  //
  25. $zSQL = 'SELECT '.$zWartosci.' FROM nauczyciel'.$zWarunek;
  26. //
  27. while($zIle--)
  28. {
  29.  //
  30. $zListaNauczycieli[] = new Nauczyciel($zDane);
  31. }
  32.  
  33. return $zListaNauczycieli;
  34. }
  35. }
  36. ?>


głównie problem jest w tym że:
1. mam wywołania new Nauczyciel i new Uczeń, jak to zrobić w klasie ogólnej
2. w obu klasach są zmienne $zUczenTab = array ... i $zNauczycielTab = array ... (mają różne komórki) a czy da się zrobić tak sprawnie żeby odziedziczone funkcje działały na tych zmiennych (bez przekazywania parametrów do funkcji)

ogólnie rzecz biorąc zastanawiam się jak zrobić klasę rodzica - Osoba na podstawie wyżej podanych fragmentów klas, żeby mogły po niej dziedziczyć

pewnie to wszystko zamotałem, ale może ktoś z Was pomoże mi smile.gif
menic
możliwości jest kilka. Mozesz np. zrobić abstrakcyjna klase osoba i poniej dziedziczyć. Zamiast nazw zNauczycielTab poprostu samo zTab. I pozniej tworzysz poprostu new Uczen i masz metody z klasy Osoba.
enigma
Cytat(menic @ 8.03.2007, 20:00:25 ) *
Zamiast nazw zNauczycielTab poprostu samo zTab.
no fakt, przyćmiło mnie tongue.gif przecież można później do tabeli wprowadzić wszystkie potrzebne komórki

ale i tak zamotałem temat
jeszcze raz o głównym problemie
załóżmy mam już ta klasę osoba
i w niej funkcję pobierz_dane, która będzie dziedziczona w klasach uczeń i nauczyciel no ale jeżeli ta funkcja ma tworzyć tabelę obiektów to jak mam ją napisać żeby w klasie uczeń robiła new uczeń ... a w klasie nauczyciel new nauczyciel ?
splatch
Można pokusić się o rozwinięcie idei...

  1. <?php
  2. // Definicje wspólne dla wielu obiektów
  3. interface ILiveSchoolElement {} // na codzień w szkole
  4. interface IPeople {} // jakaś osoba
  5. interface ITeacher extends People {} // nauczyciel
  6. interface ILearner extends People {} // uczeń
  7.  
  8. // Implementacja metod wspólnych
  9. abstract class AbstractPeople implements People {}
  10. abstract class AbstractPeopleLiveSchoolElement extends AbstractPeople implements ILiveSchoolElement {}
  11.  
  12. // Specjalizacja, implementacja metod specyficznych
  13. class Teacher extends AbstractPeopleLiveSchoolElement implements ITeacher {}
  14. class Learner extends AbstractPeopleLiveSchoolElement implements ILearner {}
  15.  
  16. // i może na końcu ..
  17. class Jacek extends Learner {}
  18. ?>


Wyzwól swój umysł z okowów strukturalnych błędów.
menic
Możesz np.
  1. <?php
  2. function fPobierzDane($zWartosci, $zKryteria = null)
  3. {
  4.  //
  5. $zSQL = 'SELECT '.$zWartosci.' FROM nauczyciel'.$zWarunek;
  6. //
  7. while($zIle--)
  8. {
  9.  //
  10. $zLista[] = new __CLASS__($zDane); //__CLASS__ pobierze nazwe klasy
  11. }
  12.  
  13. return $zLista;
  14. }
  15. ?>
enigma
Cytat(splatch @ 8.03.2007, 20:46:29 ) *
Wyzwól swój umysł z okowów strukturalnych błędów.
małymi krokami, ale się staram tongue.gif


Cytat(menic @ 8.03.2007, 20:57:05 ) *
new __CLASS__($zDane); //__CLASS__ pobierze nazwe klasy
no tak, tyle że zwraca mi nazwę klasy rodzica - osoba a mi jest potrzebna nazwa klasy która dziedziczy tę funkcję czyli uczeń lub nauczyciel. Znalazłem get_class() ale, ona używa $this a ja nie mogę używać $this bo funkcja pobierz_dane jest statyczna
UDAT
Jeśli dobrze zrozumiałem, to spróbuj czegoś takiego:
  1. <?php
  2. class Osoba {
  3. public abstract static newInstance ( $zDane );
  4. public abstract getTableName ( );
  5.  
  6. public static function fPobierzDane($zWartosci, $zKryteria = null)
  7. {
  8.  //
  9. $zSQL = 'SELECT '.$zWartosci.' FROM '. self::getTableName() . ' ' .$zWarunek;
  10. //
  11. while($zIle--)
  12. {
  13.  //
  14. $zLista[] = self::newInstance()($zDane);
  15. }
  16.  
  17. return $zLista;
  18. }
  19. }
  20. ?>
domis86
Cytat(enigma @ 8.03.2007, 22:37:15 ) *
no tak, tyle że zwraca mi nazwę klasy rodzica - osoba a mi jest potrzebna nazwa klasy która dziedziczy tę funkcję czyli uczeń lub nauczyciel. Znalazłem get_class() ale, ona używa $this a ja nie mogę używać $this bo funkcja pobierz_dane jest statyczna


Hmm, statyczna? To to jest jakiś singleton, ktory zwraca jakąś tablice obiektow swojego typu? Nie wyglada mi to najlepiej. Odradzam stsosowania tu statycznych metod.

Moze wytlumacz jasniej co ta funkcja PobierzDane ma robic?
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.