Ścisłe standardy: deklaracja childClass :: customMethod () powinna być zgodna z deklaracją parentClass :: customMethod ()
Jakie są możliwe przyczyny tego błędu w PHP? Gdzie mogę znaleźć informacje o tym, co to znaczy być kompatybilnym ?
php
methods
standards-compliance
waiwai933
źródło
źródło
function customMethod( ... )
use Closure;
go do początku mojej klasy (ponieważ podpowiedź do typu byłaClosure
). Więc ... pamiętaj, aby sprawdzić, czy nie brakuje takich zależności.Odpowiedzi:
childClass::customMethod()
ma inne argumenty lub inny poziom dostępu (publiczny / prywatny / chroniony) niżparentClass::customMethod()
.źródło
parentClass::customMethod($thing = false)
ichildClass::customMethod($thing)
spowoduje błąd, ponieważ metoda dziecka nie zdefiniowała wartości domyślnej dla pierwszego argumentu.&
) w argumentach może również wywołać ten błąd.Ten komunikat oznacza, że istnieją pewne możliwe wywołania metod, które mogą zakończyć się niepowodzeniem w czasie wykonywania. Załóżmy, że tak
Kompilator sprawdza tylko wywołanie $ a-> foo () pod kątem wymagań A :: foo (), która nie wymaga żadnych parametrów. $ a może jednak być obiektem klasy B, który wymaga parametru, więc wywołanie zakończy się niepowodzeniem w czasie wykonywania.
To jednak nigdy nie może zawieść i nie powoduje błędu
Zatem żadna metoda nie może mieć więcej wymaganych parametrów niż jej metoda nadrzędna.
Ta sama wiadomość jest również generowana, gdy wskazówki dotyczące typów nie pasują, ale w tym przypadku PHP jest jeszcze bardziej restrykcyjne. To daje błąd:
tak jak to:
Wydaje się, że jest to bardziej restrykcyjne niż powinno być i zakładam, że wynika to z przyczyn wewnętrznych.
Różnice w widoczności powodują inny błąd, ale z tego samego podstawowego powodu. Żadna metoda nie może być mniej widoczna niż jej metoda nadrzędna.
źródło
jeśli chcesz zachować formularz OOP bez wyłączania błędów, możesz również:
źródło
func_get_args()
, czyli wB
,public function foo($a = null, $b = null, $c = null)
jak to nie zerwać kontrakt obiecałA
.Aby rozwinąć ten błąd w kontekście interfejsu, jeśli wpisujesz wskazówki dotyczące parametrów funkcji w następujący sposób:
interfejs A
Klasa B.
Jeśli zapomniałeś dołączyć
use
instrukcji do swojej klasy implementującej (Klasa B), otrzymasz również ten błąd, mimo że parametry metody są identyczne.źródło
Napotkałem ten problem podczas próby rozszerzenia istniejącej klasy z GitHub. Spróbuję się wytłumaczyć, najpierw pisząc zajęcia tak, jak myślałem, że powinny, a potem zajęcia tak, jak jest teraz.
Co myślałem
Co w końcu zrobiłem
Wygląda więc na to, że ten błąd pojawia się również wtedy, gdy używasz metody zwracającej klasę z przestrzenią nazw i próbujesz zwrócić tę samą klasę, ale z inną przestrzenią nazw. Na szczęście znalazłem to rozwiązanie, ale nie do końca rozumiem korzyści płynące z tej funkcji w php 7.2, dla mnie normalne jest przepisywanie istniejących metod klas tak, jak ich potrzebujesz, w tym przedefiniowanie parametrów wejściowych i / lub nawet zachowanie metoda.
Jedną z wad poprzedniego podejścia jest to, że IDE nie mogły rozpoznać nowych metod zaimplementowanych w \ mycompany \ CutreApi \ ClassOfVendor (). Więc na razie pójdę z tą implementacją.
Obecnie zrobione
Więc zamiast próbować użyć metody „cokolwiek”, napisałem nową o nazwie „getWhthing”. W rzeczywistości obie robią to samo, po prostu zwracają klasę, ale z różnymi przestrzeniami nazw, jak opisałem wcześniej.
Mam nadzieję, że to może komuś pomóc.
źródło