Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [oop] wykozystywanie metody z klasy a w klasie b
skowron-line
post
Post #1





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
LBO
post
Post #2





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
skowron-line
post
Post #3





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


a mam jeszcze jedno pytanie co powinno sie umieszczac w konstruktorze??
Go to the top of the page
+Quote Post
LBO
post
Post #4





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Jeżeli to pytanie do moich przykładów to na pewno w konstruktorze trzeba inicjalizować zmienne przechowujące instancje.
Go to the top of the page
+Quote Post
skowron-line
post
Post #5





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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??
Go to the top of the page
+Quote Post
phpion
post
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
LBO
post
Post #7





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.

Ten post edytował LBO 1.06.2007, 20:40:15
Go to the top of the page
+Quote Post
Ludvik
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #9





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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.

Ten post edytował Cysiaczek 2.06.2007, 07:25:02
Go to the top of the page
+Quote Post
Ludvik
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #11





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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 : >
Go to the top of the page
+Quote Post
menic
post
Post #12





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

Ostrzeżenie: (0%)
-----


Zawsze mozna tez stworzyc cos ala przeciazanie. W zaleznosci od ilosci parametrow podanych przy tworzeniu obiektu wywolujemy inne metody.
Go to the top of the page
+Quote Post
crashu
post
Post #13





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.04.2007

Ostrzeżenie: (0%)
-----


nalezalo by tez wspomniec o slowku parent (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) nie pede pisal o co chodzi zapodam tylko przyklad (IMG:http://forum.php.pl/style_emoticons/default/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. ?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 20:02