Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zdefiniowanie interfejsu zatrzymuje aplikację
Forum PHP.pl > Forum > PHP > Object-oriented programming
deniol13
Witam, mam problem. Jeśli zdefiniuję interfejs:
  1. interface CustomException
  2. {
  3. /**
  4. * Display exception
  5. */
  6. abstract function display();
  7. }


To skrypt PHP się zatrzymuje. Jeszcze żadna klasa nie implementuje tego interfejsu... Jeśli usuną ten interfejs to skrypt się wykona, co jest nie tak? Raportowanie błędów na E_ALL a nie ma żadnego błędu.
phpion
Wywal abstract sprzed metody.

Jeszcze odnośnie braku błędu: powinieneś otrzymać:
Cytat
Fatal error: Access type for interface method CustomException::display() must be omitted

Samo error reporting nie wystarczy. Musisz jeszcze dać ini_set('display_errors', 'on') albo ustawić tą wartość w php.ini
deniol13
Oczywiście pomogło, ale dlaczego to nie chciało działać? W książce PHP5 Zaawansowane Programowania na stronie 45 są opisane interfejsy i tam jest interfejs którego metody poprzedzone są abstract... błąd autora?
bzeebzee
Albo błąd autora albo źlę zrozumiałeś pojęcię interfejsu w konteksie tamtej strony. Na klasy abstrakcyjne czasem mówi się interfejs. Klasa mogła być abstrakcyjna i posiadać taką metodę.
Orzeszekk
Interfejs jest klasa abstrakcyjna w ktorej wszystkie metody sa abstrakcyjne, nie-statyczne oraz publiczne. Jest to zbior nagłówkow metod za pomocą ktorych mozna sie komunikowac z obiektem (na pewno).

moze interfejsy w php nie maja zbyt duzego zastosowania bo to jezyk dynamiczny, ale w javie np uzywa sie ich aby okreslic czy jakas klasa jest w stanie wykonac dana czynnosc (np jesli implementuje Serializable to znaczy ze mozna ja serializowac, itd..).

Z tych cech interfejsow ktore podalismy wynika ze kazda metoda w klasie jest na pewno abstrakcyjna, wiec nie uzywamy tego keyworda.

interface costam
{
public function jedna();
public function druga();
}

interfejs moglbys zapisac za pomoca klasy abstrakcyjnej

abstract class costam
{
abstract public function jedna();
abstract public function druga();
}


jednak taki sposob zapisania nie pozwala na zaimplementowanie kilku interfejsow jednoczesnie , a jak zrobisz interface to mozesz ich i 100 zaimplementowac w klasie smile.gif
deniol13
Oczywiście dzięki za pomoc!

Mam jeszcze jedno pytanie co do wyjątków, teraz nie mam jak tego sprawdzić a mianowicie jeśli mam blok try i w nim wykonam kilka operacji, które mogą wypluć wyjątek i co się wtedy stanie gdy np wszystkie (lub dowolna ilość większa od 1) rzuci wyjątkiem? Oczywiście pod blokiem try mam blog catch. Mniej więcej to tak wyglądało by:

  1. try
  2. {
  3. $obiekt->wygenerujWyjatek( true );
  4. $obiekt->wygenerujWyjatek( true );
  5. $obiekt->wygenerujWyjatek( true );
  6. $obiekt->wygenerujWyjatek( true );
  7. $obiekt->wygenerujWyjatek( true ); //throw new Exception( 'test' );
  8. }
  9. catch( Exception $Exception )
  10. {
  11. echo $Exception->getMessage();
  12. }



Czy wyechuje mi się kilka wiadomości wyjątków?
404
Cytat
(...)co się wtedy stanie gdy np wszystkie (lub dowolna ilość większa od 1) rzuci wyjątkiem?

Nie ma takiej możliwości. Kiedy Twoja aplikacja napotka
  1. throw
- czyli rzuci wyjątek - leci bez opamiętania to pierwszego bloku
  1. catch
, który dany wyjątek obsłuży.
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.