Oto mój kod:
function phpwtf(string $s) {
echo "$s\n";
}
phpwtf("Type hinting is da bomb");
Co powoduje ten błąd:
Błąd krytyczny możliwy do uchwycenia: Argument 1 przekazany do phpwtf () musi być instancją ciągu, podano ciąg
To więcej niż trochę orwellowski, gdy PHP rozpoznaje i odrzuca pożądany typ w tym samym oddechu. Jest pięć świateł, do cholery.
Jaki jest odpowiednik podpowiedzi typu dla ciągów w PHP? Premia do odpowiedzi, która dokładnie wyjaśnia, co się tutaj dzieje.
php
types
type-hinting
leepowers
źródło
źródło
Odpowiedzi:
Przed wersją PHP 7 podpowiedzi można używać tylko do wymuszania typów obiektów i tablic. Typy skalarne nie nadają się do typowania. W tym przypadku oczekiwany jest obiekt klasy
string
, ale dajesz mu (skalar)string
. Komunikat o błędzie może być zabawny, ale na początku nie powinien działać. Biorąc pod uwagę dynamiczny system pisania, ma to w pewnym sensie zboczony sens.Można jedynie ręcznie „wpisać wskazówkę” typów skalarnych:
źródło
Z podręcznika PHP :
Więc masz to. Komunikat o błędzie nie jest zbyt pomocny, ale ci to daję.
** Edycja 2017 **
PHP7 wprowadziło więcej deklaracji typu danych funkcji, a wspomniany link został przeniesiony do Argumentów funkcji: deklaracje typów . Z tej strony:
Ostatnie ostrzeżenie jest tak naprawdę istotne dla zrozumienia błędu „Argument musi być typu ciąg, podany ciąg”; ponieważ głównie jako nazwy argumentów dozwolone są tylko nazwy klas / interfejsów, PHP próbuje zlokalizować „klasę” nazwy klasy, ale nie może jej znaleźć, ponieważ jest to typ prymitywny, dlatego nie udaje się z tym niezręcznym błędem.
źródło
PHP pozwala na „podpowiedzi”, gdzie podajesz klasę, aby określić obiekt. Zgodnie z instrukcją PHP „Wskazówki dotyczące typów mogą być tylko typu obiektowego i tablicowego (od PHP 5.1). Tradycyjne podpowiedzi typu z int i łańcuchem nie są obsługiwane”. Błąd jest mylący z powodu wyboru „łańcucha” - wstaw „myClass” na swoim miejscu, a błąd będzie brzmiał inaczej: „Argument 1 przekazany do phpwtf () musi być instancją myClass, podano ciąg znaków”
źródło
Jak już powiedzieli inni, podpowiedzi typów działają obecnie tylko dla typów obiektów. Ale myślę, że konkretny błąd, który wywołałeś, może polegać na przygotowaniu nadchodzącego typu łańcucha SplString .
Teoretycznie zachowuje się jak ciąg znaków, ale ponieważ jest to obiekt, przejdzie weryfikację typu obiektu. Niestety nie ma go jeszcze w PHP 5.3, może pojawić się w wersji 5.4, więc nie przetestowałem tego.
źródło
W PHP 7.0 deklaracje typu pozwalają skalarne typy, więc te typy są już dostępne:
self
,array
,callable
,bool
,float
,int
,string
. Pierwsze trzy były dostępne w PHP 5, ale ostatnie cztery są nowe w PHP 7. Jeśli użyjesz czegoś innego (np.integer
Lubboolean
), będzie to interpretowane jako nazwa klasy.Więcej informacji znajduje się w podręczniku PHP .
źródło
Może nie jest to bezpieczne i ładne, ale jeśli musisz:
źródło
new string(array(1,2,3))
Wystąpił ten błąd podczas wywoływania funkcji z kontrolera Laravel do pliku PHP.
Po kilku godzinach znalazłem problem: użyłem $ this z funkcji statycznej.
źródło
Using $this when not in object context
jest rzeczywiście tajemniczą wiadomością.(pierwotnie opublikowane przez leepowers w swoim pytaniu)
Komunikat o błędzie jest mylący z jednego ważnego powodu:
Nazwy typów pierwotnych nie są zastrzeżone w PHP
Poniżej przedstawiono wszystkie prawidłowe deklaracje klas:
Mój błąd polegał na tym, że komunikat o błędzie dotyczył wyłącznie pierwotnego typu łańcucha - słowo „instancja” powinno mnie zatrzymać. Przykład ilustrujący dalej:
Wynik:
W PHP jest możliwe,
string
że jeststring
wyjątkiem, chyba że tak naprawdę jeststring
. Podobnie jak w przypadku każdego języka korzystającego z niejawnej konwersji typu, kontekst jest wszystkim.źródło
Myślę, że rzutowanie typu na php wewnątrz bloku, String na PHP nie jest obiektem, jak wiem:
źródło
(string) $s
może$s
zgłosić błąd, jeśli jest obiektem, którego nie można rzutować na łańcuch (nie ma__toString()
zaimplementowanej metody), więc nie jest to takie proste