Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Interface - pytanie
Forum PHP.pl > Forum > Przedszkole
Micchaleq
Witam serdecznie,

W ostatnim czasie czytam książkę o PHP aby poukładać sobie odpowiednio informacji, aż tu nagle okazało się że są tu jeszcze inferfejsy ...

Najgorsze jednak jest to, że nie bardzo to rozumiem.

Tzn wiem, ze interface przechowuje jedynie funkcje metody ( bez żadnych instrukcji )

i teraz chciałem zapytać w jakim celu są stosowane

czy dobrze rozumiem ,że deklarując klasę która implementuje interfejs musi posiadać metody które zawiera interface?

Jeżeli tak, to czy klasy dziedziczące po klasie implementujacej dany interfejs musi posiadać również te metody czy nie?
Sephirus
Interfejs to nic innego jak wytyczne do utworzenia klasy zgodnej z jakimś wzorcem, bądź mogącej zostać użytej w jakimś kontekście.

Tak jak pisałeś interfejs to deklaracja metod, które MUSZĄ być zaimplementowane w klasie. Przykładem może być na przykład coś takiego:

  1. class niby_tablica
  2. {
  3. public $tablica;
  4. }



Aby policzyć teraz ile elementów ma niby_tablica::$tablica należało by napisać tak:

  1.  
  2. $nt = new niby_tablica;
  3.  
  4. echo count($nt->tablica);



Ale łatwiej było by napisać:

  1.  
  2. $nt = new niby_tablica;
  3.  
  4. echo count($nt);
  5.  


Tyle, że to nie zwróci nam tak naprawdę wielkości zmiennej $tablica. Możemy zaimplementować Interfejs Countable, który ma raptem jedną metodę count()

  1.  
  2. class niby_tablica implements Countable
  3. {
  4. public $tablica;
  5.  
  6. public function count()
  7. {
  8. return count($this->tablica);
  9. }
  10. }
  11.  
  12. $nt = new niby_tablica;
  13.  
  14. echo count($nt);



Teraz wyświetli to autentyczną liczbę elementów tablicy $tablica. Ale... czy zadziałało by to bez "implements Countable"? Po prostu samo dodanie metody count() czy da taki sam efekt? - Odpowiedź jest prosta - NIE - dlaczego? Bo php'owa funkcja count sprawdza czy ma do czynienia z obiektem i jeśli tak to sprawdza czy implementuje on interfejs Countable i jeśli tak to używa jego funkcji count() - bo ma pewność, że ów obiekt taką posiada - wymaga to implementacja interfejsu.

Interfejsu służą zatem do deklarowania ogólnych list metod wymaganych przez jakiś obiekt, ale jak widać nie tylko tongue.gif

jeżeli interesujesz się tym dalej - zapoznaj się również z klasą abstrakcyjną wink.gif
Micchaleq
Oki to mniej więcej już to rozumiem,

teraz pozostają 2 ostatnie kwetiw,

Czy klasa dziedzicząca po klasie implementującej musi posiadać również te metody?

np :
  1. interface a{
  2. function count();
  3. }
  4. class b implements a{
  5.  
  6. function count(){
  7. echo "aa";
  8. }
  9. }
  10.  
  11. class c extend b{
  12. questionmark.gif
  13. }


PS :
Właśnie o te abstrakcyjne klasy chciałem zapytać bo już się z nimi spotkałem
Daiquiri
Klasy abstrakcyjne zawierają po prostu definicje metod (np. wspólne funkcjonalności dla grupy klas) w odróżnieniu od interfejsów.
Sephirus
Na to pytanie można odpowiedzieć sobie samemu smile.gif Jeżeli klasa "A" to klasa podstawowa, implementuje ona Interfejs "I" to klasa "B" dziedzicząca od "A" ma to wszystko co "A" prawda? smile.gif Więc - TAK ma od razu zaimplementowany Interfejs wink.gif

Co do klas abstrakcyjnych to prosty przykład:

  1. abstract class moja_klasa_abstrakcyjna
  2. {
  3. // metody, które muszą zostać zaimplementowane w klasie dziedziczącej (jak w interfejsie)
  4.  
  5. abstract public function metoda_1() {}
  6. abstract protected function metoda_2() {}
  7.  
  8. // metody, które mogą zostać odziedziczone (ich nadpisywanie nie jest wymagane)
  9. protected function metoda_3()
  10. {
  11. echo 'tralala';
  12. }
  13. }
  14.  
  15. // Samego interfejsu nie da się powołać do życia a czy klasę abstrakcyjną się da?
  16.  
  17. $test = new moja_klasa_abstrakcyjna; // NIE - wywali to błąd - klasa abstrakcyjna nie może mieć instancji...
  18.  


Po klasie abstrakcyjnej można jedynie dziedziczyć - w pewnym sensie działa ona jak interfejs bo wymusza zaimplementowanie w pochodnej klasie metod oznaczonych jako "abstract" ale pozwala ona także na deklaracje zwykłych metod i własności, które można normalnie dziedziczyć wink.gif

Istnieje możliwość zablokowania zmiany metody w klasach pochodnych poprzez dodanie przed nimi "final" - tak samo jeśli da się to przed deklaracją samej klasy - nie można z niej dziedziczyć wink.gif
Micchaleq
No to ostatnie pytanie.

otóż gdzieś wyczytałem, że klasa abstrakcyjna implementująca dany interface nie musi posiadać wszystkich metod które są w nim zdeklarowane.

Czy to prawda?
nospor
Cytat
Czy to prawda?
Przecież może napisać sobie prosty interfejs, prostą klasę abstrakcyjną i sam sprawdzić czy to prawda czy nie, prawda?
Micchaleq
Cytat(nospor @ 21.11.2011, 10:12:07 ) *
Przecież może napisać sobie prosty interfejs, prostą klasę abstrakcyjną i sam sprawdzić czy to prawda czy nie, prawda?

aż tak głupi nie jestem by tego nie wiedzieć.
Zanim tu przyszedłem nie działało mi to więc grzecznie pytam.
nospor
Skoro ci nie działałalo, znaczy że nie można smile.gif


ps: albo napisałeś zły kod, bo raczej można wink.gif
Micchaleq
  1. <?php
  2. interface pinter{
  3.  
  4. public function aa();
  5. public function bb();
  6.  
  7. }
  8.  
  9. abstract class info implements pinter{
  10.  
  11. public function aa(){
  12. return $this->bb();
  13. }
  14. }
  15.  
  16. class inf extends info{
  17.  
  18. public function bb(){
  19. return "tekst";
  20. }
  21. }
  22. ?>


Zły kod czy odpowiedz na moje pytanie ?
nospor
Prawidłowy kod potwierdzający twoje pytanie - nie musi posiadać
Coś ci nie działa ten kod? Bo mi działa wyśmienicie
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.