Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [oop] wykozystywanie metody z klasy a w klasie b
skowron-line
post 1.06.2007, 19:50:31
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


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
LBO
post 1.06.2007, 20:13:06
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 1.06.2007, 20:21:53
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??


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
LBO
post 1.06.2007, 20:24:21
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 1.06.2007, 20:25:21
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??


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
phpion
post 1.06.2007, 20:30:50
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 tongue.gif
Go to the top of the page
+Quote Post
LBO
post 1.06.2007, 20:45:40
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 1.06.2007, 21:59:59
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 2.06.2007, 07:24:40
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


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Ludvik
post 2.06.2007, 08:12:20
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 2.06.2007, 08:44:12
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 : >


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
menic
post 3.06.2007, 16:35:20
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.


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
crashu
post 22.06.2007, 13:22:39
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 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. ?>


--------------------
Black Tarantula
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2025 - 09:23