Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Interface - pytanie
Micchaleq
post
Post #1





Grupa: Zarejestrowani
Postów: 186
Pomógł: 4
Dołączył: 13.10.2009

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


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?

Ten post edytował Micchaleq 21.11.2011, 09:36:23
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


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 (IMG:style_emoticons/default/tongue.gif)

jeżeli interesujesz się tym dalej - zapoznaj się również z klasą abstrakcyjną (IMG:style_emoticons/default/wink.gif)

Ten post edytował Sephirus 21.11.2011, 09:48:44
Go to the top of the page
+Quote Post
Micchaleq
post
Post #3





Grupa: Zarejestrowani
Postów: 186
Pomógł: 4
Dołączył: 13.10.2009

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


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. }


PS :
Właśnie o te abstrakcyjne klasy chciałem zapytać bo już się z nimi spotkałem

Ten post edytował Micchaleq 21.11.2011, 09:50:30
Go to the top of the page
+Quote Post
Daiquiri
post
Post #4





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Klasy abstrakcyjne zawierają po prostu definicje metod (np. wspólne funkcjonalności dla grupy klas) w odróżnieniu od interfejsów.
Go to the top of the page
+Quote Post
Sephirus
post
Post #5





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Na to pytanie można odpowiedzieć sobie samemu (IMG:style_emoticons/default/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? (IMG:style_emoticons/default/smile.gif) Więc - TAK ma od razu zaimplementowany Interfejs (IMG:style_emoticons/default/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ć (IMG:style_emoticons/default/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ć (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Micchaleq
post
Post #6





Grupa: Zarejestrowani
Postów: 186
Pomógł: 4
Dołączył: 13.10.2009

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


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





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Czy to prawda?
Przecież może napisać sobie prosty interfejs, prostą klasę abstrakcyjną i sam sprawdzić czy to prawda czy nie, prawda?
Go to the top of the page
+Quote Post
Micchaleq
post
Post #8





Grupa: Zarejestrowani
Postów: 186
Pomógł: 4
Dołączył: 13.10.2009

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


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





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Skoro ci nie działałalo, znaczy że nie można (IMG:style_emoticons/default/smile.gif)


ps: albo napisałeś zły kod, bo raczej można (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Micchaleq
post
Post #10





Grupa: Zarejestrowani
Postów: 186
Pomógł: 4
Dołączył: 13.10.2009

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


  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 ?

Ten post edytował Micchaleq 21.11.2011, 10:44:04
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Prawidłowy kod potwierdzający twoje pytanie - nie musi posiadać
Coś ci nie działa ten kod? Bo mi działa wyśmienicie
Powód edycji: [nospor]:
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: 23.12.2025 - 23:42