Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziwne argumenty metod
Forum PHP.pl > Forum > PHP > Object-oriented programming
Jarod
Przykład z książki:
  1. <?php
  2. interface Band {
  3. public function getName();
  4. public function addMusician (Musician $musician);
  5. ...
  6. }
  7.  
  8. interface Musician {
  9. public function addInstrument (Instrument $instrument);
  10. public function assignToBand(Band $band);
  11. ...
  12. }
  13.  
  14. interface Instrument {
  15. public function getName();
  16. public function getCategory();
  17. ...
  18. }
  19.  
  20.  
  21. class Guitarist implements Musician {
  22.  
  23. ...
  24. private $last;  
  25. private $instruments;  
  26. ...
  27.  
  28. public function addInstrument(Instrument $instrument) {
  29. array_push($this->instruments, $instrument)
  30. }
  31.  
  32. ...
  33. }
  34. ?>


I teraz mam prosbę o wyjaśnienie

1.
Wiadomo, że można tworzyć obiekt gdy definicja klasy występuje w kodzie po utworzeniu obiektu (nie ma konieczności napisania definicji funkcji przed jej wywołaniem). Czy nie wyraźniej (bardziej zrozumiale dla osoby, która przejmuje np. jakiś projekt) byłoby napisać te interfejsy w kolejności: Instrument, Musician, Band ?

2. W definicji interfejsów i klasy (które podałem wyżej) nie rozumię pewnej kwestii i prosiłbym osoby, które dobrze znają OOp o wytłumaczenie:

Dlaczego w interfejsie Musician jest

public function addInstrument (Instrument $instrument);
a nie
public function addInstrument ($instrument); ?

Podobnie jest w klasie Guitarist - dlaczego zamiast
public function addInstrument(Instrument $instrument)
nie jest
public function addInstrument(Instrument $instrument) ?
mike
1. Przyjęta kolejnośc to tylko i wyłącznie decyzja autorów. Ja też uważam że powinno być Instrument, Musician, Band
2. Taki zapis oznacza wymuszenie typu. public function addInstrument (Instrument $instrument); oznacza że parametr $instrument musi byc instancją klasy Instrument. Więcej: Podręcznik php :: Classes and Objects (php 5) :: Type Hinting
bela
Cytat
2. Taki zapis oznacza wymuszenie typu. public function addInstrument (Instrument $instrument); oznacza że parametr $instrument musi byc instancją klasy Instrument.

Albo, co chyba najważniejsze, jej potomnych.
Jarod
Cytat(mike_mech @ 6.08.2006, 00:16 ) *
2. Taki zapis oznacza wymuszenie typu. public function addInstrument (Instrument $instrument); oznacza że parametr $instrument musi byc instancją klasy Instrument.


Musi być instancją klasy intrument czy klas, które implementują interfejs instrument?
mike
Cytat(J4r0d @ 6.08.2006, 11:08 ) *
Musi być instancją klasy intrument czy klas, które implementują interfejs instrument?

Hmm, nieprecyzyjnie napisałem.
Musi być instancją klas implementujących interfejs Instrument, lub jak ~bela zauważył klas pochodnych do tych klas.


P.S.
Nie można utworzyć instancji interfejsu.
Jarod
Cytat(mike_mech @ 6.08.2006, 09:13 ) *
Hmm, nieprecyzyjnie napisałem.
Musi być instancją klas implementujących interfejs Instrument, lub jak ~bela zauważył klas pochodnych do tych klas.
P.S.
Nie można utworzyć instancji interfejsu.


Czyli do metody public function addInstrument (Instrument $instrument); można przekazać wszystkie obiekty, które implementują interfejs Instrument?

  1. <?php
  2. class Klasa1 implements Instruments {
  3.  
  4. public function addInstrument(Instrument $instrument) {
  5. array_push($this->instruments, $instrument)
  6. } 
  7. ...
  8. }
  9.  
  10. class Klasa2 implements Instruments {
  11.  
  12. public function addInstrument(Instrument $instrument) {
  13. array_push($this->instruments, $instrument)
  14. } 
  15. ...
  16. }
  17.  
  18. class Klasa3 implements Musician {
  19. ...
  20. ...
  21. }
  22.  
  23.  
  24. $myClass1 = new Klasa1;
  25. $myClass2 = new Klasa2;
  26. $myClass3 = new Klasa3;
  27.  
  28. $myClass1->addInstrument(Instrument $instrument); //Dobrze?
  29. $myClass2->addInstrument(Instrument $instrument); //Dobrze?
  30. $myClass3->addInstrument(Instrument $instrument); // Źle?
  31. ?>
mariuszn3
Wymuszenie typów możesz zastosować tylko w definicji metod, kiedy wywołujesz metode nie podpowiadasz już jakiego typu jest przesłana przez Ciebie zmienna a więc tak:
  1. <?php
  2. $myClass1->addInstrument($instrument);
  3. ?>

Zakładam, że gdzieś wcześniej określiłeś zmienną $instrument i jest to instancja klasy implementującej Instrument.
Jarod
  1. <?php
  2. $myClass1->addInstrument($instrument); //Dobrze?
  3. $myClass2->addInstrument($instrument); //Dobrze?
  4. $myClass3->addInstrument($instrument); // Źle?
  5. ?>


Czy to jest poprawne rozumowanie?
mariuszn3
Nie wiem rozumowanie jakiej kwestii masz na myśli.. ale zapis jest jak najbardziej prawidłowy..
Jarod
Cytat(mariuszn3 @ 6.08.2006, 12:43 ) *
Nie wiem rozumowanie jakiej kwestii masz na myśli.. ale zapis jest jak najbardziej prawidłowy..


Chodzi mi o to czy dobrze rozumiem, że
  1. <?php
  2. $myClass3->addInstrument($instrument);
  3. ?>
jest błędne
mariuszn3
Jest błędne tylko dlatego, że Klasa3 nie ma zdefiniowanej metody addInstrument()
Jarod
Cytat(mariuszn3 @ 6.08.2006, 13:06 ) *
Jest błędne tylko dlatego, że Klasa3 nie ma zdefiniowanej metody addInstrument()


A nawet gdyby miała to i tak byłoby błędnie. Przecież nie implementuje interfejsu Instrument.. :/
mariuszn3
To, że nie implementuje nie oznacza, że jej metody nie mogą przyjmować instancji obiektów które implementują instrument.
Jarod
Cytat(mariuszn3 @ 6.08.2006, 13:19 ) *
To, że nie implementuje nie oznacza, że jej metody nie mogą przyjmować instancji obiektów które implementują instrument.



Zgłupiałem już:
Cytat(mike_mech @ 6.08.2006, 09:13 ) *
Hmm, nieprecyzyjnie napisałem.
Musi być instancją klas implementujących interfejs Instrument, lub jak ~bela zauważył klas pochodnych do tych klas.
mariuszn3
No dobrze.. ale co musi być instancją tych klas? Klasa do której metody się odwołujesz.. czy obiekt, który przekazujesz do metody? smile.gif ..przyjrzyj się temu uważnie.
Jarod
Cytat(mariuszn3 @ 6.08.2006, 13:30 ) *
No dobrze.. ale co musi być instancją tych klas? Klasa do której metody się odwołujesz.. czy obiekt, który przekazujesz do metody? smile.gif ..przyjrzyj się temu uważnie.


Nie wiem już o czym piszesz. Możesz to jakoś jaśniej wytłumaczyć?
mariuszn3
Przyjrzyj się uważnie podanemu przez siebie przykładowi z książki i temu co Ty później napisałeś. Kluczową różnicą jest to, że w przykładzie z książki klasa Guitarist nie implementuje interfejsu Instrument.. nie mniej jej metoda addInstrument() przyjmuje obiekty, które implementują instrument..
To co później napisałeś to coś zupełnie innego - stwierdzenie, że jeśli klasa sama w sobie nie implementuje danego interfejsu to jej metody nie mogą przyjmować obiektów, które implementują dany interfejs co jest z zasady bzdurnym założeniem.
envp
Stary, nie zagłębiaj się, aż tak, bo po pierwsze w tej książce w kodach są błędy, po drugie, autorzy napisali ją tak jakby to było dla nich karą a po trzecie do OOP trzeba dorosnąć i i tego nei nauczysz się tak o .. pstryk i juz smile.gif OOP to idea programowania. Przeczytaj gdzies tak do narzedzi uzytecznych czy jak to tam bylo i od tamtad zacznij dopiero psiac smile.gif. Pozatym uzupelniaj sie googlem, bo naprawde ta ksiazka jest 'zakrecowna'
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.