• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zaimplementować interfejs ?

Object Storage Arubacloud
0 głosów
202 wizyt
pytanie zadane 4 grudnia 2022 w PHP przez mat19 Obywatel (1,580 p.)

Mam interface Headers, oraz dwie klasy które go implementują.  Mój problemem jest pierwszym argument w funkcji profile(). Pojawia się błąd PHP Fatal error: Declaration of Mess\Http\HttpHeaders::profile(Mess\Http\HttpHeaders $headers, int $userId): Mess\Http\HttpHeader must be compatible with Mess\Http\Headers::profile(Mess\Http\ Headers $headers, int $userId): Mess\Http\Header Jak mogę to naprawić ?

interface Headers
{
    public function profile(Headers $headers, int $userId): Header;

    public function homepage(): Header;

}

class HttpHeaders implements Headers
{
    public function profile(HttpHeaders $headers, int $userId): HttpHeader
    {
        return HttpHeader::profile($userId);
    }
}

class TestHeaders implements Headers
{
    public function profile(TestHeaders $headers,int $userId): TestHeader
    {
        return new TestHeader($headers, 'profile.php');
    }
}

 

1 odpowiedź

+1 głos
odpowiedź 4 grudnia 2022 przez Arkadiusz Waluk Ekspert (287,950 p.)

Tak jak mówi błąd, w klasie HttpHeaders (i w TestHeaders później to samo) masz metodę profile, której deklaracja nie zgadza się z tym co jest w interfejsie Headers, bo powinno być identycznie. U Ciebie w HttpHeaders pierwszy argument to obiekt klasy HttpHeaders, a powinien być Headers jak w interfejsie.

Jeśli chciałeś osiągnąć efekt, aby jako pierwszy argument do metody profile można było przekazać obiekt klasy HttpHeaders lub TestHeaders (a obydwie te klasy implementują interfejs Headers) to w pierwszym argumencie klas HttpHeaders i TestHeaders musisz zadeklarować typ po prostu Headers. Wtedy to przejdzie ze względu na ten sam interfejs obydwu klas.

komentarz 4 grudnia 2022 przez mat19 Obywatel (1,580 p.)
Ale nie wiem dlaczego to nie działa, w interfejsie typ zwracany profile() to Header, a w HttpHeaders ma ta funkcja typ zwracany HttpHeader i to działa, więc dlaczego to nie przechodzi z argumentem ?
komentarz 4 grudnia 2022 przez Arkadiusz Waluk Ekspert (287,950 p.)
W miejscu typu zwracanego to się po prostu inaczej zachowuje, można powiedzieć że odwrotnie. Tam możesz zadeklarować np. klasy, które implementują dany interfejs. W teorii oczekiwany efekt też wtedy jest, bo będzie zwrócona klasa dla tego interfejsu, czyli coś "powyżej" - jest gwarancja, że reguły interfejsu będą spełnione. Ale nie znam dokładnej genezy dlaczego zostało to tak zrobione, czy to jest jedyny powód czy nie.

W przypadku typu argumentu mógłbyś podać kolokwialnie mówiąc "coś wyżej" w klasach, które implementują interfejs i też by przeszło pomimo fizycznej różnicy deklaracji. Przykładowo jakby była dodatkowa klasa A, która implementuje interfejs X, i jako typ argumentu metody w interfejsie Headers podałbyś interfejs X, a w klasach, które go implementują, podał jako typ klasę A, to by nie zadziałało. Ale już jakbyś w interfejsie Headers zadeklarował typem obiekt klasy A, a w klasach, które go implementują, chciał dopuścić jako typ interfejs X, to by zadziałało. Przykład: https://3v4l.org/NDN0M
komentarz 5 grudnia 2022 przez mat19 Obywatel (1,580 p.)
A mógłbyś zmodyfikować ten kod tak żeby nie pojawiał się ten błąd? Byłbym wdzięczny
komentarz 5 grudnia 2022 przez Arkadiusz Waluk Ekspert (287,950 p.)

Napisałem chyba dość wprost co jest nie tak - nie zgadza się deklaracja w klasach w interfejsem. Masz w interfejsie w 3 linii:

public function profile(Headers $headers, int $userId)

a w HttpHeaders i TestHeaders:

public function profile(HttpHeaders $headers, int $userId)

wystarczy zamienić powyższy kawałek na ten pierwszy i powinno normalnie działać. 

Podobne pytania

0 głosów
1 odpowiedź 675 wizyt
0 głosów
1 odpowiedź 187 wizyt
pytanie zadane 3 listopada 2016 w PHP przez HaKIM Szeryf (87,590 p.)
0 głosów
1 odpowiedź 980 wizyt
pytanie zadane 25 kwietnia 2019 w PHP przez sensor Użytkownik (680 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...