Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Interfejsy - problem
Forum PHP.pl > Forum > PHP > Object-oriented programming
dasko
Otóż właśnie chciałem napisać na wiki o obserwatorze i chciałem wykorzystać w przykładach zaimplementowane w php 5.1 interfejsy Subject i Observer(oba z SPL)...

Poleciałem je przez Reflection::export() i wywnioskowałem, że interfejsy te wyglądają tak:
  1. <?php
  2.  
  3. interface Subject {
  4. public function attach(Observer $observer);
  5. public function detach(Observer $observer);
  6. public function notify();
  7. }
  8.  
  9. interface Observer {
  10. public function update(Subject $subject);
  11. }
  12.  
  13. ?>


Taki zapis...
  1. <?php
  2.  
  3. public function attach(Observer $observer);
  4.  
  5. ?>

...wymaga aby przesłać argument klasy Observer. Klasy, nie interfejsu. I tutaj pojawia się problem - istnieje interfejs Observer - czyli nie można zdefiniować klasy o takiej samej nazwie - interfejsy i klasy maja tą samą przestrzeń nazw. A więc z tego wynika, że nie da się poprawnie napisać klasy implementującej ten interfejs, bo:
  • po pierwsze - typy argumentów w interfejsie muszą się zgadzać z typami zdefiniowanymi w klasie,
  • po drugie - typ argumentu to nazwa klasy, a nie interfejsu,
  • po trzecie - klasy o nazwie Observer juz nie zdefiniuję, bo istnieje interfejs o takiej nazwie,
  • po czwarte - interfejsu nie zmienię, ani nie usunę bo jest wbudowany,
  • po piąte - interfejsy te stworzyli chyba po to, żeby z nich korzystać a nie usuwać.
Tak więc piszcie co o tym sądzicie. Może to cos z moją głową(jest już późno), a może błąd w php, a może co innego. Dzięki za każdą sensowna odpowiedź smile.gif
DeyV
O - jak miło. Ostatnio jak zaglądałem do SPL to nie znalazłem tam jeszce tych klas. Fajnie, że sie pojawiły.


Zapis function attach(Observer $observer) oznacza, że podawany argument ma dziedziczyć z interfejsu/klasy Observer.
I to jest właśnie podstawowe zadanie dla Interfejsów w PHP5.
Być może bowiem zapomniałeś, że nie jest to Java, a zapis taki nie przeprowadza żadnego rzutowania typów.
Wszystko sprowadza się do tego, że rejestrowany Obserwator musi mieć metodę Update, a można to wymusić tylko poprzez narzucenie, że musi dziedziczyć z odpowiedniego interfejsu.
dasko
Arrggh biggrin.gif
Z Javą mi się nie pomyliło, bo Javy zbytnio nie znam ;]
Tak myślałem, że gdzieś coś przeoczyłem - napisałem takie cuś:
  1. <?php
  2.  
  3. public function update(Observer $subject) {
  4. // ...
  5.  
  6. ?>

Czyli po prostu zamiast Subject napisałem Observer biggrin.gif

Ale i tak dzięki DeyV :*
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.