Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [oop] wykozystywanie metody z klasy a w klasie b
Forum PHP.pl > Forum > PHP > Object-oriented programming
skowron-line
witam mam pytanie zapewne banalne i wiele osob zadrwi ze mnie ale ze dopiero stawiam pierwsze kroki w OOP mam takie pytanie

jezeli mam klase do A i w niej jakies metody i teraz w klasie B chcę uzyc metody z klasy A to czy mozna to zrobic?? i jak to zrobic?? czy tu chodzi o dziedziczenie?? prosilbym moze o jakis prosty przyklad
LBO
Można, przez dziedziczenie (klasa B dziedziczy po klasie A), zawarcie instancji klasy A w klasie B albo uczynienie metodę klasy A statyczna:
  1. <?php
  2. class A {
  3. public function methodA()
  4. {
  5.  print __METHOD__.PHP_EOL;
  6. }
  7. }
  8.  
  9. class B extends A {
  10. public function methodB()
  11. {
  12.  $this->methodA(); // A::methodA() jest również zwyczajnie dostępna jako metoda klasy B (bo jest publiczna;
  13. }
  14. }
  15. ?>


  1. <?php
  2. class A {
  3. public function methodA()
  4. {
  5.  print __METHOD__.PHP_EOL;
  6. }
  7. }
  8.  
  9. class B {
  10. /*
  11.  * @var A
  12.  */
  13. private $_A;
  14.  
  15. public function __construct()
  16. {
  17. $this->_A = new A();
  18. }
  19.  
  20. public function methodB()
  21. {
  22.  $this->A->methodA();
  23. }
  24. }
  25. ?>



  1. <?php
  2. class A {
  3. public static function methodA()
  4. {
  5.  print __METHOD__.PHP_EOL;
  6. }
  7. }
  8.  
  9. class B {
  10. public function methodB()
  11. {
  12.  A::methodA();
  13. }
  14. }
  15. ?>





edit:

Oczywiście każde z tych rozwiązań posiada plusy i minusy.. trzeba wybrać odpowiednio do potrzeb.
skowron-line
a mam jeszcze jedno pytanie co powinno sie umieszczac w konstruktorze??
LBO
Jeżeli to pytanie do moich przykładów to na pewno w konstruktorze trzeba inicjalizować zmienne przechowujące instancje.
skowron-line
Cytat(LBO @ 1.06.2007, 19:24:21 ) *
Jeżeli to pytanie do moich przykładów to na pewno w konstruktorze trzeba inicjalizować zmienne przechowujące instancje.


to pytanie ogolnie jak mam klase do rejestracji uzytkownikow to co powinno byc w konstruktorze??
phpion
Ja bym to zrobił tak, że napisałbym klasę UsersManager, która mogłaby zawierać metody add, edit, delete etc. i zrzucić te funkcje z klasy User. Konstruktor klasy UsersManager zostawiłbym pusty dopiero do metod przekazywałbym parametry. No ale ja dopiero zaczynam OOP więc moje podejście może być złe tongue.gif
LBO
Cytat(skowron-line @ 1.06.2007, 21:25:21 ) *
to pytanie ogolnie jak mam klase do rejestracji uzytkownikow to co powinno byc w konstruktorze??


Nie możesz zadawać takich pytań. Sprawa implementacji jest kwestią indywidualną.
Napisz jakiś kod, a na pewno znajdziesz pomoc, żeby poprawic, ulepszyc etc.

edit:
Ktoś wspomniał o managerze.. a ja rejestrację (jako najmniejsza składową np. wpis do bazy) umieściłbym w klasie User odpowiedzialnej za logikę działań na danych poszczególnego użytkownika.

edit:

Cytat(phpion.com @ 1.06.2007, 21:30:50 ) *
Ja bym to zrobił tak, że napisałbym klasę UsersManager, która mogłaby zawierać metody add, edit, delete etc. i zrzucić te funkcje z klasy User.

A ja sama rejestracje widzę już jako logikę strony/serwisu... pewnie dlatego, że za bardzo myślę wg MVC





Po zastanowieniu, mogę stwierdzić, że jakkolwiek to zaimplementujesz najważniejszym jest, żeby działało. Różne sposoby (wzorce) kodowania "wymuszają" na programiście używanie pewnych utartych schematów. Jedyna nadzieja w zatarciu różnic to coraz lepsze poznawanie, a co najważniejsze zrozumienie OOP - wydaje mi się, że na samym końcu tej drogi, wszyscy dochodzą do tych samych wniosków.
Ludvik
W konstruktorze umieszcza się kod tworzący obiekt. Mówiąc po ludzku, po wykonaniu konstruktora obiekt musi być gotowy do przyjmowania poleceń. Czyli jak masz klasę do rejestracji użytkowników, to pewnie łączy się ona z bazą danych. Z tego można wyciągnąć wniosek, że w konstruktorze musisz przygotować połączenie z bazą (przekazać referencję do obiektu będącego interfejsem używanego dbms albo utworzyć nowy uchwyt). Wszystkie atrybuty klasy muszą zostać też przygotowane.
Cysiaczek
Można też kwestię przygotowania obiektu zrzucić na wywołania jego metod konfiguracyjnych, zamiast używać do tego konstruktora. Taka polityka sprawdza się, gdy nasz obiekt jest zależny od innych obiektów. np.
Zamiast robić tak:
  1. <?php
  2. class User{
  3.  
  4. function __construct($id, $name, $accessType){}
  5. }
  6. ?>


można
  1. <?php
  2. class User{
  3.  
  4. function __construct($id){ //jakkeś unikalne id
  5. }
  6.  
  7. function setName($name){}
  8. function setAccessType($accessType){}
  9.  
  10. }
  11. ?>


Wszystko oczywiście zależy od okoliczności : )

Pozdrawiam.
Ludvik
Tylko użycie metod konfiguracyjnych narzuca sposób korzystania z obiektu. Zanim wywołasz jakąkolwiek inną metodę, wpierw musisz wywołać konfiguracyjne. Trzeba się pilnować, żeby o tym nie zapomnieć... Konstruktor zwalnia trochę z myślenia.
Cysiaczek
Oczywiście. Niektóre obiekty (np. obiekty używane jedynie przez framework) można w ten sposób "podnosić", inne już nie, bo API stałoby się zbyt skomplikowane. Zresztą - nic nie stoi na przeszkodzie w wykorzystaniu obu możliwości jednocześnie : >
menic
Zawsze mozna tez stworzyc cos ala przeciazanie. W zaleznosci od ilosci parametrow podanych przy tworzeniu obiektu wywolujemy inne metody.
crashu
nalezalo by tez wspomniec o slowku parent smile.gif nie pede pisal o co chodzi zapodam tylko przyklad tongue.gif

  1. <?php
  2. class A {
  3. public function method()
  4. {
  5.  print __METHOD__.PHP_EOL;
  6. }
  7. }
  8.  
  9. class B extends A {
  10. public function method()
  11. {
  12.  print __METHOD__.PHP_EOL;
  13.  parent::method();
  14. }
  15. }
  16. ?>
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.