Wszyscy napotykają błędy składniowe. Nawet doświadczeni programiści tworzą literówki. Dla początkujących jest to tylko część procesu uczenia się. Jednak często interpretacja komunikatów o błędach, takich jak:
Błąd analizy PHP: błąd składni, nieoczekiwany „{” w index.php w linii 20
Nieoczekiwany symbol nie zawsze jest prawdziwym winowajcą. Ale numer wiersza daje przybliżone pojęcie, od czego zacząć szukać.
Zawsze patrz na kontekst kodu . Błąd składni często chowa się w wymienionych lub w poprzednich linii kodu . Porównaj swój kod z przykładami składni z podręcznika.
Chociaż nie każdy przypadek pasuje do drugiego. Istnieją jednak ogólne kroki w celu rozwiązania błędów składniowych . Te odniesienia podsumowały typowe pułapki:
Nieoczekiwany T_VARIABLE
Nieoczekiwany „$ varname” (T_VARIABLE)Nieoczekiwany T_CONSTANT_ENCAPSED_STRING
Nieoczekiwany T_ENCAPSED_AND_WHITESPACENiespodziewany
,
(przecinek)Nieoczekiwany
.
(kropka)Niespodziewany
;
(średnik)Niespodziewany
*
(gwiazdka)Niespodziewany
:
(dwukropek)Niespodziewany
&
(podanie przez referencję czasu połączenia)
Ściśle powiązane odniesienia:
- Co oznacza ten błąd w PHP? (błędy w czasie wykonywania)
- Co oznacza ten symbol w PHP? (tokeny językowe)
- Te
“”
inteligentne‘’
cytaty nic nie znaczą dla PHP
I:
- Podręcznik PHP na php.net i jego różne tokeny językowe
- Lub wprowadzenie do składni Wikipedii na temat PHP .
- Na koniec, oczywiście, nasza php tag-wiki .
Podczas gdy Stack Overflow jest również mile widziany dla początkujących programistów, jest on głównie ukierunkowany na profesjonalne pytania programistyczne.
- Odpowiedź na wszystkie błędy kodowania i wąskie literówki jest w większości nie na temat.
- Zanim opublikujesz prośby o poprawienie składni, poświęć trochę czasu na wykonanie podstawowych kroków .
- Jeśli nadal musisz to zrobić, pokaż swoją inicjatywę rozwiązywania problemów, próbuj poprawek i swój proces przemyślenia na temat tego, co wygląda lub może być złe.
Jeżeli twój przeglądarka wyświetla komunikaty o błędach, takie jak „Błąd składni: niedozwolony znak”, to tak naprawdę nie jestphpzwiązane, ale javascript- błąd składniowy .
Błędy składniowe zgłaszane w kodzie dostawcy: Na koniec należy wziąć pod uwagę, że jeśli błąd składniowy nie został zgłoszony podczas edycji bazy kodu, ale po instalacji lub aktualizacji pakietu zewnętrznego dostawcy, może to wynikać z niezgodności wersji PHP, więc sprawdź wymagania dostawcy w stosunku do platformy Ustawiać.
źródło
T_IF / T_FOREACH / ...
bloku. Chociaż chciałem skompilować bardziej niestandardowe podsumowanie dla pytań IF / ELSE / ELSEIF.Odpowiedzi:
Jakie są błędy składniowe?
PHP należy do języków programowania w stylu C i imperatywnych . Ma sztywne reguły gramatyczne, których nie może odzyskać po napotkaniu niewłaściwie umieszczonych symboli lub identyfikatorów. Nie może odgadnąć twoich zamiarów kodowania.
Najważniejsze wskazówki
Istnieje kilka podstawowych środków ostrożności, które zawsze możesz podjąć:
Użyj właściwego wcięcia kodu lub zastosuj dowolny wzniosły styl kodowania. Czytelność zapobiega nieprawidłowościom.
Użyj IDE lub edytora dla PHP z podświetlaniem składni . Co również pomaga w równoważeniu nawiasów / nawiasów.
Przeczytaj odniesienia do języka i przykłady w instrukcji. Dwa razy, aby stać się nieco biegłym.
Jak interpretować błędy analizatora składni
Typowy komunikat o błędzie składni brzmi:
Która zawiera listę możliwych lokalizacji błędu składniowego. Zobacz wspomnianą nazwę pliku i numer linii .
Moniker takie jak
T_STRING
wyjaśnia symbol który parser / tokenizer nie może przetworzyć w końcu. Jednak niekoniecznie jest to przyczyną błędu składniowego.Ważne jest, aby spojrzeć na poprzednie linie kodu . Często błędy składniowe to po prostu wpadki, które miały miejsce wcześniej. Numer wiersza błędu jest dokładnie tam, gdzie parser ostatecznie zrezygnował z przetworzenia wszystkiego.
Rozwiązywanie błędów składniowych
Istnieje wiele podejść do zawężania i naprawiania czkawek składniowych.
Otwórz wspomniany plik źródłowy. Spójrz na wspomnianą linię kodu .
W przypadku niekontrolowanych ciągów i niewłaściwie rozmieszczonych operatorów zwykle znajduje się winowajcę.
Przeczytaj linię od lewej do prawej i wyobraź sobie, co robi każdy symbol.
Bardziej regularnie musisz także patrzeć na poprzednie wiersze .
W szczególności brakuje brakujących
;
średników na końcach / instrukcjach poprzedniego wiersza. (Przynajmniej z punktu widzenia stylu).Jeśli
{
bloki kodu}
są niepoprawnie zamknięte lub zagnieżdżone, może być konieczne zbadanie jeszcze bardziej kodu źródłowego. Użyj odpowiedniego wcięcia kodu, aby to uprościć.Spójrz na kolorowanie składni !
Ciągi, zmienne i stałe powinny mieć różne kolory.
Operatorzy
+-*/.
powinni również mieć wyraźne zabarwienie. W przeciwnym razie mogą znajdować się w niewłaściwym kontekście.Jeśli zauważysz, że zabarwienie sznurka rozciąga się zbyt daleko lub zbyt krótko, oznacza to, że masz nieskryty lub brakujący znacznik zamknięcia
"
lub'
sznurka.Posiadanie obok siebie dwóch znaków interpunkcyjnych w tym samym kolorze może również oznaczać problemy. Zazwyczaj operatorzy samotny, jeśli nie jest to
++
,--
czy nawiasy następujące operatora. Dwa ciągi / identyfikatory bezpośrednio po sobie są niepoprawne w większości kontekstów.Biała spacja jest twoim przyjacielem . Postępuj zgodnie z dowolnym stylem kodowania.
Tymczasowo przerywaj długie linie.
Możesz dowolnie dodawać znaki nowej linii między operatorami lub stałymi i łańcuchami. Analizator składni następnie skonkretyzuje numer linii pod kątem błędów analizy. Zamiast patrzeć na bardzo długi kod, możesz wyizolować brakujący lub źle umieszczony symbol składni.
Podziel złożone
if
instrukcje na odrębne lub zagnieżdżoneif
warunki.Zamiast długich wzorów matematycznych lub łańcuchów logicznych użyj zmiennych tymczasowych, aby uprościć kod. (Bardziej czytelny = mniej błędów).
Dodaj nowe linie między:
Partycjonowanie bloków długiego kodu naprawdę pomaga zlokalizować źródło błędów składniowych.
Komentuj obraźliwy kod.
Jeśli nie możesz wyizolować źródła problemu, zacznij komentować (a tym samym tymczasowo usuwać) bloki kodu.
Jak tylko pozbyłeś się błędu analizy, znalazłeś źródło problemu. Przyjrzyj się bliżej.
Czasami chcesz tymczasowo usunąć pełne bloki funkcji / metody. (W przypadku niedopasowanych nawiasów klamrowych i błędnie wciętego kodu.)
Jeśli nie możesz rozwiązać problemu ze składnią, spróbuj przepisać skomentowane sekcje od zera .
Jako nowicjusz unikaj niektórych mylących konstrukcji składni.
? :
Operator warunków trójskładnikowych może kompaktować kod i jest rzeczywiście przydatny. Ale nie poprawia to czytelności we wszystkich przypadkach. Preferuj prosteif
stwierdzenia, gdy nie są sprawdzone.Alternatywna składnia PHP (
if:
/elseif:
/endif;
) jest powszechna dla szablonów, ale prawdopodobnie łatwiejsza do naśladowania niż normalne bloki{
kodu}
.Najczęstsze błędy nowoprzybyłych to:
Brakujące średniki
;
do kończenia instrukcji / linii.Niedopasowane cytaty ciągów
"
lub'
cytaty nieskalowane wewnątrz.Zapomniani operatorzy, w szczególności dla
.
konkatenacji łańcuchów .Niezrównoważone
(
nawiasy)
. Policz je w zgłoszonej linii. Czy jest ich tyle samo?Nie zapominaj, że rozwiązanie jednego problemu ze składnią może odkryć następny.
Jeśli sprawisz, że jeden problem zniknie, a inne pojawią się w poniższym kodzie, przeważnie jesteś na dobrej drodze.
Jeśli po edycji nowego błędu składniowego pojawia się w tym samym wierszu, wówczas próba zmiany była prawdopodobnie błędem. (Nie zawsze jednak.)
Przywróć kopię zapasową wcześniej działającego kodu, jeśli nie możesz go naprawić.
diff
uszkodzoną i ostatnią działającą wersję. Co może być pouczające o tym, na czym polega problem ze składnią.Niewidzialne zbłąkane znaki Unicode : W niektórych przypadkach musisz użyć hekseditora lub innego edytora / przeglądarki na swoim źródle. Niektórych problemów nie można znaleźć na podstawie samego kodu.
Spróbuj
grep --color -P -n "\[\x80-\xFF\]" file.php
jako pierwszy środek znaleźć symbole inne niż ASCII.W szczególności BOMy, spacje o zerowej szerokości lub spacje nierozdzielające oraz inteligentne cytaty regularnie mogą znaleźć drogę do kodu źródłowego.
Zadbaj o to, jaki rodzaj łamania linii jest zapisywany w plikach.
PHP po prostu honoruje \nnowe linie, a nie \rzwroty karetki.
Co czasami stanowi problem dla użytkowników MacOS (nawet w systemie OS X w przypadku źle skonfigurowanych edytorów).
Często pojawia się tylko jako problem, gdy używane są jednowierszowe
//
lub#
komentarze./*...*/
Komentarze wielowierszowe rzadko zakłócają analizator składni, gdy łamanie wierszy jest ignorowane.Jeśli błąd składniowy nie jest przesyłany przez Internet : Zdarza się, że masz błąd składniowy na swoim komputerze. Ale opublikowanie tego samego pliku w Internecie już go nie pokazuje. Co może oznaczać tylko jedną z dwóch rzeczy:
Patrzysz na zły plik!
Lub twój kod zawiera niewidzialny zbłąkany Unicode (patrz wyżej). Możesz łatwo się dowiedzieć: po prostu skopiuj kod z formularza internetowego do edytora tekstu.
Sprawdź swoją wersję PHP . Nie wszystkie konstrukcje składniowe są dostępne na każdym serwerze.
php -v
dla interpretera wiersza poleceń<?php phpinfo();
dla tego wywołanego przez serwer WWW.To niekoniecznie jest to samo. W szczególności podczas pracy z frameworkami będziesz je dopasowywać.
Nie używaj zastrzeżonych słów kluczowych PHP jako identyfikatorów funkcji / metod, klas lub stałych.
Próba i błąd to ostatnia deska ratunku.
Jeśli wszystko inne zawiedzie, zawsze możesz google wyświetlić komunikat o błędzie. Symbole składniowe nie są tak łatwe do wyszukiwania (sam przepełnienie stosu jest indeksowane przez SymbolHound chociaż ). Dlatego może minąć kilka kolejnych stron, zanim znajdziesz coś istotnego.
Dalsze przewodniki:
Biały ekran śmierci
Jeśli witryna jest po prostu pusta, przyczyną jest zazwyczaj błąd składniowy. Włącz ich wyświetlanie za pomocą:
error_reporting = E_ALL
display_errors = 1
Na
php.ini
ogół lub przez.htaccess
dla mod_php, a nawet.user.ini
z konfiguracjami FastCGI.Włączenie go w uszkodzonym skrypcie jest za późno, ponieważ PHP nie może nawet zinterpretować / uruchomić pierwszego wiersza. Szybkim obejściem jest utworzenie skryptu opakowania, powiedz
test.php
:Następnie wywołaj błąd, uzyskując dostęp do tego skryptu opakowania.
Pomaga także włączyć PHP
error_log
i przeglądać serwer WWW,error.log
gdy skrypt ulega awarii przy odpowiedziach HTTP 500.źródło
error_reporting(E_ALL | E_STRICT);
dla wcześniejszych wersji PHPMyślę, że ten temat jest całkowicie przesadzony / skomplikowany. Korzystanie z IDE jest sposobem na całkowite uniknięcie błędów składniowych. Powiedziałbym nawet, że praca bez IDE jest trochę nieprofesjonalna. Dlaczego? Ponieważ nowoczesne IDE sprawdzają składnię po każdym wpisanym znaku. Kiedy kodujesz, a cała linia zmienia kolor na czerwony, a duże ostrzeżenie pokazuje dokładny typ i dokładną pozycję błędu składni, wtedy absolutnie nie ma potrzeby szukania innego rozwiązania.
Używanie IDE do sprawdzania składni oznacza:
(Skutecznie) nigdy więcej nie napotkasz błędów składniowych, po prostu dlatego, że widzisz je poprawnie podczas pisania. Poważnie.
Doskonałe IDE z kontrolą składni (wszystkie z nich są dostępne dla systemów Linux, Windows i Mac):
źródło
Niespodziewany
[
Obecnie nieoczekiwany
[
nawias tablicowy jest często spotykany w nieaktualnych wersjach PHP. Składnia krótki tablica jest dostępna od PHP > = 5,4 . Obsługiwane są tylko starsze instalacjearray()
.Dereferencje wyników funkcji tablic również nie są dostępne dla starszych wersji PHP:
Odwołanie - co oznacza ten błąd w PHP? - „Błąd składni, nieoczekiwany
\[
” pokazuje najczęstsze i praktyczne obejścia.Chociaż zawsze lepiej jest po prostu zaktualizować instalację PHP. W przypadku wspólnych planów hostingu najpierw sprawdź, czy np.
SetHandler php56-fcgi
Można użyć do włączenia nowszego środowiska wykonawczego.Zobacz też:
BTW, są też preprocesory i down-konwertery składni PHP 5.4 jeśli jesteś naprawdę przywiązany do starszych i wolniejszych wersji PHP.
Inne przyczyny nieoczekiwanych
[
błędów składniowychJeśli nie jest to niezgodność wersji PHP, to często jest to zwykła pomyłka literowa lub błąd składni nowicjusza:
Nie możesz używać deklaracji / wyrażeń właściwości tablic w klasach , nawet w PHP 7.
Często mylone
[
jest otwieranie nawiasów klamrowych{
lub nawiasów(
.Lub nawet:
Lub próbujemy wyzerować stałe (przed PHP 5.6) jako tablice:
Przynajmniej PHP interpretuje to
const
jako stałą nazwę.Jeśli chciałeś uzyskać dostęp do zmiennej tablicowej (co jest tutaj typową przyczyną), dodaj wiodący
$
sigil - tak więc staje się$varname
.Próbujesz użyć
global
słowa kluczowego na elemencie tablicy asocjacyjnej. To nie jest poprawna składnia:Nieoczekiwany
]
zamykający nawias kwadratowyJest to nieco rzadsze, ale zdarzają się również wypadki składniowe z kończącym się
]
wspornikiem tablicy .Ponownie niedopasowania z
)
nawiasami lub}
nawiasami klamrowymi są powszechne:Lub próbujemy zakończyć tablicę tam, gdzie jej nie ma:
Co często występuje w deklaracjach tablic wieloliniowych i zagnieżdżonych .
Jeśli tak, użyj IDE do dopasowania nawiasów, aby znaleźć przedwczesne
]
zamknięcie tablicy. Przynajmniej użyj więcej odstępów i znaków nowej linii, aby ją zawęzić.źródło
Nieoczekiwany T_VARIABLE
„Nieoczekiwany
T_VARIABLE
” oznacza, że istnieje dosłowna$variable
nazwa, która nie pasuje do bieżącej struktury wyrażeń / instrukcji.brakujący średnik
Najczęściej wskazuje brakujący średnik w poprzednim wierszu. Zmienne przypisania następujące po instrukcji są dobrym wskaźnikiem, gdzie szukać:
Łączenie ciągów
Częstym nieszczęściem są konkatenacje łańcuchów z zapomnianym
.
operatorem:Przy okazji powinieneś preferować interpolację łańcuchów (podstawowe zmienne w podwójnych cudzysłowach), gdy tylko to poprawia czytelność. Co pozwala uniknąć problemów ze składnią.
Brakujące operatory wyrażeń
Oczywiście ten sam problem może pojawić się w innych wyrażeniach, na przykład operacjach arytmetycznych:
PHP nie może zgadnąć , czy zmienna powinna zostać dodana, odjęta lub porównana itp.
Listy
To samo dotyczy list składniowych, takich jak w populacjach tablic, w których analizator składni wskazuje również oczekiwany przecinek,
,
na przykład:Lub listy parametrów funkcji:
Równoważnie widzisz to z
list
lubglobal
oświadczenia, lub gdy brakuje;
średnik wfor
pętli.Deklaracje klasowe
Ten błąd analizatora składni występuje również w deklaracjach klas . Możesz przypisywać tylko stałe statyczne, a nie wyrażenia. Zatem parser narzeka na zmienne jako przypisane dane:
Niedopasowane
}
zamykające się nawiasy klamrowe mogą w szczególności prowadzić tutaj. Jeśli metoda zostanie zakończona zbyt wcześnie (użyj poprawnego wcięcia!), Wówczas zmienna zbłąkana jest często umieszczana w treści deklaracji klasy.Zmienne po identyfikatorach
Nigdy nie możesz mieć zmiennej bezpośrednio podążającej za identyfikatorem :
Przy okazji jest to częsty przykład, w którym intencją było użycie zmiennych zmiennych . W tym przypadku
$this->{"myFunc$VAR"}();
na przykład wyszukiwanie właściwości zmiennej .Brakuje nawiasów po konstrukcjach językowych
Hasty wpisując może prowadzić do zapomnianej otwierania lub zamykania nawiasu dla
if
ifor
orazforeach
sprawozdania:Rozwiązanie: dodaj brakujące otwarcie
(
między instrukcją a zmienną.Kędzierzawy
{
klamra nie otworzy blok kodu, bez zamykaniaif
wyraz z)
pierwszym nawiasem zamykającym.W przeciwnym razie nie oczekuje warunków
Rozwiązanie: Usuń warunki
else
lub użyjelseif
.Potrzebujesz wsporników do zamknięcia
Rozwiązanie: dodaj nawiasy kwadratowe
$var
.Niewidoczne białe znaki
Jak wspomniano w odpowiedzi na odniesienie do „Niewidocznego zbłąkanego Unicode” (takiego jak niełamliwa spacja ), możesz również zobaczyć ten błąd w przypadku niczego niepodejrzewającego kodu, takiego jak:
Jest to dość powszechne na początku plików i w przypadku kopiowania i wklejania kodu. Sprawdź za pomocą hekseditora, czy twój kod nie wydaje się zawierać problemu ze składnią.
Zobacz też
źródło
Nieoczekiwany T_CONSTANT_ENCAPSED_STRING
Nieoczekiwany T_ENCAPSED_AND_WHITESPACE
Nieporęczne nazwy
T_CONSTANT_ENCAPSED_STRING
iT_ENCAPSED_AND_WHITESPACE
odnoszą się do cytowanych literałów"string"
.Są używane w różnych kontekstach, ale problem ze składnią jest dość podobny. T_ENCAPSED… ostrzeżenia pojawiają się w kontekście podwójnie cytowanych ciągów, podczas gdy ciągi T_CONSTANT… są często mylone w prostych wyrażeniach lub instrukcjach PHP.
Niepoprawna interpolacja zmiennych
I najczęściej pojawia się w przypadku niepoprawnej interpolacji zmiennych PHP:
Cytowanie kluczy tablic jest koniecznością w kontekście PHP. Ale w ciągach podwójnie cytowanych (lub HEREDOC) jest to błąd. Analizator składniowy narzeka na zawarty pojedynczy cytat
'string'
, ponieważ zwykle oczekuje tam literalnego identyfikatora / klucza.Mówiąc dokładniej, w przypadku podwójnych cudzysłowów w odniesieniu do tablic można stosować prostą składnię w stylu PHP2
Zagnieżdżone tablice lub głębsze odwołania do obiektów wymagają jednak złożonej składni wyrażeń kręconych :
W razie wątpliwości jest to zwykle bezpieczniejsze w użyciu. Często jest to nawet uważane za bardziej czytelne. A lepsze IDE faktycznie używają do tego wyraźnego kolorowania składni.
Brak konkatenacji
Jeśli ciąg znaków występuje po wyrażeniu, ale nie zawiera konkatenacji lub innego operatora, zobaczysz, że PHP narzeka na literał ciągu:
Chociaż jest to oczywiste dla ciebie i dla mnie, PHP po prostu nie zgadnie, że łańcuch miał być tam dołączony.
Mylące ciągi znaków cytatów
Ten sam błąd składniowy występuje przy myleniu ograniczników ciągu . Ciąg rozpoczynający się od pojedynczego
'
lub podwójnego"
cudzysłowu również kończy się tym samym.Ten przykład zaczął się od podwójnych cudzysłowów. Ale podwójne atrybuty były również przeznaczone dla atrybutów HTML. Zamierzony operator konkatenacji w obrębie został jednak zinterpretowany jako część drugiego ciągu w pojedynczych cudzysłowach.
Jest to dobry przykład, w którym nie powinieneś wyrwać się z podwójnych cudzysłowów. Zamiast tego po prostu użyj odpowiednich
\"
znaków ucieczki dla cytatów atrybutów HTML:Chociaż może to również prowadzić do pomyłek w składni, wszystkie lepsze IDE / edytory ponownie pomagają, inaczej kolorując cytowane znaki.
Brak cytatu otwierającego
Równie zapomniane jest otwieranie
"
/'
cytowanie przepisu na błędy parsera:Tutaj
', '
stałoby się literałem łańcuchowym po słowie, kiedy oczywiścielogin
miał być parametrem łańcuchowym.Listy tablic
Jeśli przegapisz
,
przecinek w bloku tworzenia tablicy, analizator składni zobaczy dwa kolejne ciągi:Pamiętaj, że ostatni wiersz może zawsze zawierać dodatkowy przecinek, ale przeoczenie jednego z nich jest niewybaczalne. Które trudno odkryć bez podświetlania składni.
Listy parametrów funkcji
To samo dotyczy wywołań funkcji :
Uciekające sznurki
Częstą odmianą są po prostu zapomniane terminatory łańcuchowe:
Tutaj PHP skarży się na dwa dosłowne ciągi znaków bezpośrednio za sobą. Ale prawdziwą przyczyną jest oczywiście niezamknięty poprzedni ciąg.
Zobacz też
źródło
Nieoczekiwany T_STRING
T_STRING
jest trochę mylące. Nie odnosi się do cytowanego"string"
. Oznacza to, że napotkano surowy identyfikator. Może to wahać się odbare
słów po resztkiCONSTANT
lub nazwy funkcji, zapomniane ciągi bez cudzysłowu lub dowolny zwykły tekst.Błędnie napisane struny
Ten błąd składniowy występuje jednak najczęściej w przypadku źle napisanych wartości ciągu. Każde nieskalowane i zbłąkane
"
lub'
cytat utworzy nieprawidłowe wyrażenie:Podświetlanie składni sprawi, że takie błędy będą bardzo oczywiste. Ważne jest, aby pamiętać o używaniu ukośników odwrotnych do unikania
\"
podwójnych cudzysłowów lub\'
pojedynczych cudzysłowów - w zależności od tego, który został użyty jako ciąg znaków ."
podwójnych cudzysłowów.echo
/print
linie zamiast ucieczki do środka i na zewnątrz. Jeszcze lepiej zastanów się nad sekcją HEREDOC .Innym przykładem jest użycie wpisu PHP w kodzie HTML wygenerowanym za pomocą PHP:
Dzieje się tak, gdy
$text
jest duży z wieloma liniami, a programista nie widzi całej wartości zmiennej PHP i skupia się na kawałku kodu zapominając o jego źródle. Przykładem jest tutajZobacz także Jaka jest różnica między ciągami pojedynczymi i podwójnymi w PHP? .
Niezamknięte sznurki
Jeśli przegapisz zamknięcie,
"
błąd składniowy zwykle pojawia się później. Ciąg niezakończony często zużywa trochę kodu, aż do następnej zamierzonej wartości ciągu:T_STRING
Parser może wówczas protestować nie tylko dosłownie . Inną częstą odmianą jestUnexpected '>'
niecytowany dosłowny HTML.Nieprogramowe ciągi znaków
Jeśli skopiujesz i wkleisz kod z bloga lub strony internetowej, czasami kończy się to błędnym kodem. Cytaty typograficzne nie są tym, czego oczekuje PHP:
Cytaty typograficzne / inteligentne są symbolami Unicode. PHP traktuje je jako część sąsiedniego tekstu alfanumerycznego. Na przykład
”these
jest interpretowany jako stały identyfikator. Ale każdy kolejny literał tekstu jest następnie postrzegany przez parser jako słowo puste / T_STRING.Brakujący średnik; jeszcze raz
Jeśli w poprzednich wierszach znajduje się nieokreślone wyrażenie, wówczas każda następująca instrukcja lub konstrukcja języka jest postrzegana jako surowy identyfikator:
PHP po prostu nie może wiedzieć, czy zamierzasz uruchamiać dwie funkcje po kolei, czy chcesz pomnożyć ich wyniki, dodać je, porównać, czy tylko uruchomić jedną
||
lub drugą.Krótkie otwarte tagi i
<?xml
nagłówki w skryptach PHPTo raczej rzadkie. Ale jeśli włączone są short_open_tags, nie można rozpocząć skryptów PHP od deklaracji XML :
PHP to zobaczy
<?
i odzyska dla siebie. Nie zrozumie, do czegoxml
przeznaczona była błąka. Będzie interpretowany jako stały. Aleversion
będzie to postrzegane jako kolejna dosłowność / stała. A ponieważ analizator składni nie może zrozumieć dwóch kolejnych literałów / wartości bez operatora wyrażenia pomiędzy nimi, będzie to błąd analizatora składni.Niewidoczne znaki Unicode
Najbardziej ohydną przyczyną błędów składniowych są symbole Unicode, takie jak spacja nierozdzielająca . PHP dopuszcza znaki Unicode jako nazwy identyfikatorów. Jeśli otrzymasz skargę analizatora składni T_STRING dotyczącą całkowicie nie podejrzanego kodu, takiego jak:
Musisz przełamać inny edytor tekstu. Lub nawet heksitor. To, co wygląda tutaj na spacje i znaki nowej linii, może zawierać niewidoczne stałe. IDE oparte na Javie są czasem nieświadome, że BOM UTF-8 jest zniekształcone, spacje o zerowej szerokości, separatory akapitów itp. Spróbuj ponownie wszystko, usuń białe spacje i dodaj z powrotem normalne spacje.
Możesz to zawęzić, dodając zbędne
;
separatory instrukcji na początku każdej linii:Dodatkowy
;
średnik przekształci poprzedni niewidoczny znak w niezdefiniowane stałe odwołanie (wyrażenie jako instrukcja). Co w zamian powoduje, że PHP wydaje pomocne informacje.Brak znaku $ przed nazwami zmiennych
Zmienne w PHP są reprezentowane przez znak dolara, po którym następuje nazwa zmiennej.
Znak dolara (
$
) jest znakiem, który oznacza identyfikator jako nazwę zmiennej. Bez tego znaku identyfikatorem może być słowo kluczowe języka lub stała .Jest to częsty błąd, gdy kod PHP został „przetłumaczony” z kodu napisanego w innym języku (C, Java, JavaScript itp.). W takich przypadkach deklaracja typu zmiennej (gdy oryginalny kod został napisany w języku używającym zmiennych typowanych) może również wymknąć się i spowodować ten błąd.
Znaki cudzysłowu
Jeśli używasz
\
ciągu, ma to specjalne znaczenie. Nazywa się to „ znakiem ucieczki ” i zwykle mówi parserowi, aby dosłownie wziął następną postać.Przykład:
echo 'Jim said \'Hello\'';
wydrukujeJim said 'hello'
Jeśli unikniesz cytatu zamykającego łańcucha, cytat zamykający zostanie przyjęty dosłownie, a nie zgodnie z przeznaczeniem, tj. Jako cytat do wydrukowania jako część łańcucha, a nie zamknięcie łańcucha. Będzie to wyświetlane jako błąd analizy często po otwarciu następnego ciągu lub na końcu skryptu.
Bardzo częsty błąd przy określaniu ścieżek w systemie Windows:
"C:\xampp\htdocs\"
jest nieprawidłowy. Trzeba"C:\\xampp\\htdocs\\"
.źródło
Niespodziewany
(
Nawiasy otwierające zwykle podążają za konstrukcjami języka, takimi jak
if
/foreach
/for
/array
/list
lub rozpoczynają wyrażenie arytmetyczne. Są niepoprawne pod względem składniowym po"strings"
poprzednim()
, samotnym$
i w niektórych typowych kontekstach deklaracji.Parametry deklaracji funkcji
Rzadsze występowanie tego błędu polega na próbie użycia wyrażeń jako domyślnych parametrów funkcji . To nie jest obsługiwane, nawet w PHP7:
Parametry w deklaracji funkcji mogą być tylko wartościami literalnymi lub wyrażeniami stałymi. W przeciwieństwie do wywołań funkcji, z których można swobodnie korzystać
whatever(1+something()*2)
itp.Wartości domyślne właściwości klasy
To samo dotyczy deklaracji członków klasy , w których dozwolone są tylko wartości literalne / stałe, a nie wyrażenia:
Umieść takie rzeczy w konstruktorze. Zobacz także Dlaczego atrybuty PHP nie pozwalają na funkcje?
Jeszcze raz zauważ, że PHP 7 dopuszcza
var $xy = 1 + 2 +3;
tam tylko stałe wyrażenia.Składnia JavaScript w PHP
Użycie JavaScript lub składni jQuery nie będzie działać w PHP z oczywistych powodów:
Kiedy tak się dzieje, zwykle oznacza niezakończony ciąg poprzedzający; i dosłowne
<script>
sekcje przeciekające do kontekstu kodu PHP.isset (()), pusty, klucz, następny, bieżący
Zarówno
isset()
iempty()
są język Zabudowy, a nie funkcje. Muszą uzyskać bezpośredni dostęp do zmiennej . Jeśli przypadkowo dodasz za dużo nawiasów, możesz utworzyć wyrażenie:To samo dotyczy dowolnej konstrukcji języka, która wymaga niejawnego dostępu do nazwy zmiennej. Te wbudowane elementy są częścią gramatyki języka, dlatego nie pozwalają na dodatkowe nawiasy dekoracyjne.
Funkcje na poziomie użytkownika, które wymagają odwołania do zmiennej - ale otrzymują przekazany wynik wyrażenia - zamiast tego prowadzą do błędów w czasie wykonywania.
Niespodziewany
)
Brak parametru funkcji
Nie można wstawiać przecinków jako ostatniego w wywołaniu funkcji . PHP oczekuje tam wartości i narzeka na wczesne zamykanie
)
nawiasów.Przecinek końcowy jest dozwolony tylko w
array()
lublist()
konstruuje.Niedokończone wyrażenia
Jeśli zapomnisz coś w wyrażeniu arytmetycznym, wówczas parser się poddaje. Ponieważ jak należy to interpretować:
A jeśli nawet zapomnisz o zamknięciu
)
, otrzymasz skargę na nieoczekiwany średnik.Foreach as
constant
W przypadku zapomnianych
$
prefiksów zmiennych w instrukcjach sterujących zobaczysz:PHP tutaj czasami mówi, że
::
zamiast tego oczekiwał . Ponieważ zmienna class :: $ mogła spełnić oczekiwane wyrażenie zmiennej $.Niespodziewany
{
Nawiasy klamrowe
{
i}
otaczają bloki kodu. A błędy składniowe na ich temat zwykle wskazują na nieprawidłowe zagnieżdżenie.Niezrównane podwyrażenia w pliku
if
Najczęściej niezrównoważony
(
i)
jest przyczyną, gdy parser narzeka na{
zbyt wczesne pojawienie się nawiasu otwierającego . Prosty przykład:Policz nawiasy lub użyj IDE, które Ci w tym pomogą. Nie pisz też kodu bez spacji. Liczy się czytelność.
{i} w kontekście wyrażenia
W wyrażeniach nie można używać nawiasów klamrowych. Jeśli pomylisz nawiasy i nawiasy, nie będzie to zgodne z gramatyką języka:
Istnieje kilka wyjątków od konstrukcji identyfikatora, takich jak lokalna zmienna zasięgu
${references}
.Zmienne zmienne lub wyrażenia zmienne kręcone
To jest dość rzadkie. Ale możesz także otrzymywać
{
i}
analizować skargi dotyczące złożonych wyrażeń zmiennych:Chociaż istnieje większe prawdopodobieństwo nieoczekiwanego
}
w takich sytuacjach.Niespodziewany
}
Gdy
}
pojawia się „nieoczekiwany ” błąd, blok kodu jest zbyt wcześnie zamykany.Ostatnia instrukcja w bloku kodu
Może się to zdarzyć dla każdego nieskończonego wyrażenia.
A jeśli ostatni wiersz w bloku funkcji / kodu nie ma końcowego
;
średnika:W tym przypadku analizator składni nie może stwierdzić, czy być może nadal chcesz dodać
+ 25;
wynik funkcji lub coś innego.Nieprawidłowe zagnieżdżenie bloku / zapomniane
{
Czasami zobaczysz ten błąd analizatora składni, gdy blok kodu został
}
zamknięty zbyt wcześnie lub zapomniałeś otwarcia{
nawet:W powyższym fragmencie
if
nie miał otwierającego{
nawiasu klamrowego. W ten sposób zamykający}
poniżej stał się zbędny. I dlatego następne zamknięcie}
, które było przeznaczone dla tej funkcji, nie było związane z oryginalnym otwierającym{
nawiasami klamrowymi.Takie błędy są jeszcze trudniejsze do znalezienia bez odpowiedniego wcięcia kodu. Użyj IDE i dopasowania do nawiasów.
Nieoczekiwany
{
, oczekiwany(
Konstrukcje językowe wymagające nagłówka warunku / deklaracji i bloku kodu wywołują ten błąd.
Listy parametrów
Na przykład źle zadeklarowane funkcje bez listy parametrów są niedozwolone:
Warunki instrukcji kontroli
I nie możesz również mieć stanu
if
bez warunków .Co oczywiście nie ma sensu. To samo dotyczy zwykłych podejrzanych,
for
/foreach
,while
/do
itd.źródło
Nieoczekiwany koniec $
Kiedy PHP mówi o „nieoczekiwanym
$end
”, oznacza to, że Twój kod zakończył się przedwcześnie. (Komunikat jest nieco mylący, gdy jest interpretowany dosłownie. Nie chodzi o zmienną o nazwie „$ end”, jak czasami przyjmują nowi użytkownicy. Odnosi się do „końca pliku”,. EOF)To prawie zawsze o brakującym
}
nawias klamrowy zamknąć poprzednie bloki kodu.Ponownie użyj odpowiedniego wcięcia, aby uniknąć takich problemów.
Użyj IDE z dopasowaniem do nawiasów, aby dowiedzieć się, gdzie
}
jest błąd. W większości IDE i edytorów tekstowych znajdują się skróty klawiaturowe:Większość IDE podkreśla również pasujące nawiasy klamrowe, nawiasy i nawiasy. Co sprawia, że dość łatwo jest sprawdzić ich korelację:
Wyrażenia nieskończone
A
Unexpected $end
błąd składni / parser może również wystąpić do wyrażenia niezakończony lub oświadczeń:$var = func(1,
?>
EOFNajpierw spójrz na koniec skryptów. Trailing
;
jest często zbędny dla ostatniej instrukcji w dowolnym skrypcie PHP. Ale powinieneś go mieć. Właśnie dlatego, że zawęża takie problemy ze składnią.Wcięte markery HEREDOC
Innym częstym zjawiskiem jest łańcuchy HEREDOC lub NOWDOC . Znacznik kończący jest ignorowany w przypadku wiodących spacji, tabulatorów itp .:
Dlatego parser zakłada, że ciąg HEREDOC będzie kontynuowany do końca pliku (stąd „Nieoczekiwany $ end”). Prawie wszystkie środowiska IDE i edytory wyróżniające składnię sprawią, że będzie to oczywiste lub ostrzeżenie o tym.
Znaki cudzysłowu
Jeśli używasz
\
ciągu, ma to specjalne znaczenie. Nazywa się to „ znakiem ucieczki ” i zwykle mówi parserowi, aby dosłownie wziął następną postać.Przykład:
echo 'Jim said \'Hello\'';
wydrukujeJim said 'hello'
Jeśli unikniesz cytatu zamykającego łańcucha, cytat zamykający zostanie przyjęty dosłownie, a nie zgodnie z przeznaczeniem, tj. Jako cytat do wydrukowania jako część łańcucha, a nie zamknięcie łańcucha. Będzie to wyświetlane jako błąd analizy często po otwarciu następnego ciągu lub na końcu skryptu.
Bardzo częsty błąd przy określaniu ścieżek w systemie Windows:
"C:\xampp\htdocs\"
jest nieprawidłowy. Trzeba"C:\\xampp\\htdocs\\"
.Alternatywna składnia
Nieco rzadziej można zobaczyć ten błąd składniowy podczas korzystania z alternatywnej składni bloków instrukcji / kodu w szablonach. Używanie
if:
ielse:
brakująceendif;
na przykład.Zobacz też:
źródło
Nieoczekiwany T_IF
Nieoczekiwany T_ELSEIF
Nieoczekiwany T_ELSE
Nieoczekiwany T_ENDIF
Warunkowe bloki sterujące
if
,elseif
ielse
wykonaj prostą strukturę. Gdy napotkasz błąd składniowy, najprawdopodobniej jest to po prostu nieprawidłowe zagnieżdżanie bloku → z brakującymi{
nawiasami klamrowymi}
- lub o jeden za dużo.Brak
{
lub z}
powodu nieprawidłowego wcięciaNiedopasowane nawiasy klamrowe są wspólne dla gorzej sformatowanego kodu, takiego jak:
Jeśli Twój kod wygląda tak, zacznij od nowa! W przeciwnym razie będzie to niemożliwe do naprawienia dla ciebie lub kogokolwiek innego. Nie ma sensu pokazywać tego w Internecie, aby poprosić o pomoc.
Będziesz w stanie to naprawić tylko wtedy, gdy będziesz mógł wizualnie śledzić zagnieżdżoną strukturę i relację warunków warunkowych if / else i ich
{
bloków kodu}
. Użyj swojego IDE, aby sprawdzić, czy wszystkie są sparowane.Każde podwójne
}
}
zamknie nie tylko gałąź, ale poprzednią strukturę warunków. Dlatego trzymaj się jednego stylu kodowania; nie mieszaj i nie dopasowuj zagnieżdżonych drzew if / else.Oprócz spójności okazuje się, że pomocne jest również uniknięcie długich warunków. Użyj zmiennych tymczasowych lub funkcji, aby uniknąć nieczytelnych
if
-wyrażeń.IF
nie można używać w wyrażeniachZaskakująco częstym błędem nowicjusza jest próba użycia
if
instrukcji w wyrażeniu, na przykład instrukcji print:Co oczywiście jest nieważne.
Możesz użyć trójkowego warunkowego , ale uważaj na wpływ na czytelność.
W przeciwnym razie przerwij takie konstrukcje wyjściowe: użyj wielu
if
s iecho
s .Jeszcze lepiej, użyj zmiennych tymczasowych i umieść swoje warunkowe przed:
Zdefiniowanie funkcji lub metod dla takich przypadków również często ma sens.
Bloki kontrolne nie zwracają „wyników”
Teraz jest to mniej powszechne, ale kilku programistów próbuje nawet traktować
if
tak, jakby mogło zwrócić wynik :Który jest strukturalnie identyczny z użyciem
if
w obrębie ciągu konkatenacji / wyrażenia.Musisz użyć przypisania w bloku kodu :
Alternatywnie skorzystaj z
?:
trójskładnikowego porównania.If in If
Nie można zagnieżdżać
if
warunku:Co jest oczywiście zbędne, ponieważ
and
(lubor
) już umożliwia porównywanie łańcuchowe.Zapomniane
;
średnikiJeszcze raz: każdy blok kontrolny musi być instrukcją. Jeśli poprzedni fragment kodu nie jest zakończony średnikiem, to jest to gwarantowany błąd składniowy:
Przy okazji, ostatni wiersz w
{…}
bloku kodu również potrzebuje średnika.Średnik za wcześnie
Prawdopodobnie błędem jest obwinianie określonego stylu kodowania, ponieważ pułapkę tę zbyt łatwo przeoczyć:
Co dzieje się częściej, niż można sobie wyobrazić.
if ()
wyrażenia za;
jego pomocą zostanie wykonana instrukcja void.;
Staje się pusta{}
sama w sobie!{…}
Ten sposób blok zostaje odłączony odif
, i zawsze uruchamiane.else
nie ma już związku z otwartąif
konstrukcją, dlatego doprowadziłoby to do nieoczekiwanego błędu składniowego T_ELSE.Co również wyjaśnia podobnie subtelną odmianę tego błędu składniowego:
Gdzie
;
po bloku kodu{…}
kończy się całyif
konstrukt,else
składnia gałęzi składniowo.Nie używa bloków kodu
Składniowo dozwolone jest pomijanie nawiasów klamrowych
{
…}
dla bloków kodu wif
/elseif
/else
oddziałach. Który niestety jest stylem składni bardzo powszechnym dla niewersjonowanych koderów. (Przy fałszywym założeniu pisanie lub czytanie było szybsze).Jest jednak bardzo prawdopodobne, że spowoduje to przekroczenie składni. Wcześniej czy później dodatkowe instrukcje znajdą się w gałęziach if / else:
Ale faktycznie korzysta bloki kodu, ty masz napisać
{
...}
je jako takie!Else / Elseif w złej kolejności
Oczywiście jedną rzeczą do przypomnienia jest porządek warunkowy .
Możesz mieć tyle
elseif
s, ile chcesz, ale musiszelse
iść ostatni . Tak to jest.Deklaracje klasowe
Jak wspomniano powyżej , nie można mieć instrukcji sterujących w deklaracji klasy:
W takich przypadkach albo zapomniałeś definicji funkcji , albo
}
zbyt wcześnie ją zamknąłeś .Nieoczekiwany T_ELSEIF / T_ELSE
Podczas mieszania PHP i HTML zamykanie
}
dlaif/elseif
musi być w tym samym bloku PHP,<?php ?>
co następnyelseif/else
. To wygeneruje błąd jak zamknięcie}
na teif
potrzeby, aby być częściąelseif
:Prawidłowa forma
<?php } elseif
:Jest to mniej więcej odmiana nieprawidłowego wcięcia - przypuszczalnie często oparta na złych intencjach kodowania.
Nie można zacierać innych instrukcji między tokenami
if
ielseif
/ /else
tokenami strukturalnymi:Albo może wystąpić tylko w
{…}
blokach kodu, a nie między tokenami struktury kontroli.if
ielse
gałęziami.Nie możesz także rozdzielić if / else pomiędzy różne struktury kontrolne:
Nie ma związku składniowego między
if
ielse
. Zakresforeach
leksykalny kończy się na}
, więcif
kontynuacja struktury nie ma sensu .T_ENDIF
Jeśli skarży się na nieoczekiwany T_ENDIF, używasz alternatywnego stylu składni
if:
⋯elseif:
⋯else:
⋯endif;
. O czym powinieneś pomyśleć dwa razy.Częstą pułapką jest mylenie niesamowicie podobnego
:
jelita grubego dla;
średnika . (Objęte „Wczesnym średnikiem”)Ponieważ wcięcie jest trudniejsze do śledzenia w plikach szablonów, tym bardziej, gdy używasz alternatywnej składni - jest prawdopodobne,
endif;
że nie pasuje żadenif:
.Użycie
} endif;
jest podwójnymif
terminatorem.Podczas gdy „nieoczekiwany koniec $” jest zwykle ceną za zapomniane zamknięcie
}
klamry.Przypisanie a porównanie
Nie jest to więc błąd składniowy, ale warto wspomnieć w tym kontekście:
To nie jest porównanie
==
/===
, ale=
zadanie . Jest to dość subtelne i z łatwością poprowadzi niektórych użytkowników do bezradnej edycji całych bloków warunków. Najpierw uważaj na niezamierzone zadania - zawsze, gdy napotkasz błąd logiczny / złe zachowanie.źródło
Nieoczekiwany T_IS_EQUAL
Nieoczekiwany T_IS_GREATER_OR_EQUAL
Nieoczekiwany T_IS_IDENTICAL
Nieoczekiwany T_IS_NOT_EQUAL
Nieoczekiwany T_IS_NOT_IDENTICAL
Nieoczekiwany T_IS_SMALLER_OR_EQUAL
Nieoczekiwany
<
Nieoczekiwany
>
Operatory porównania, takie jak
==
,>=
,===
,!=
,<>
,!==
i<=
czy<
, a>
przede wszystkim powinny być używane tylko w wyrażeniach takich jakif
wyrażeń. Jeśli parser narzeka na nie, często oznacza to nieprawidłowe parowanie lub niedopasowane(
)
pareny wokół nich.Grupowanie Parens
W szczególności w przypadku
if
stwierdzeń z wieloma porównaniami należy uważać, aby poprawnie policzyć nawias otwierający i zamykający :Tutaj
if
warunek tutaj został już zakończony przez)
Gdy porównania stają się wystarczająco złożone, często pomaga podzielić je na wiele i zagnieżdżone
if
konstrukcje.isset () mieszane z porównywaniem
Częstym nowicjuszem jest to, że pitfal próbuje łączyć
isset()
lubempty()
porównywać:Lub nawet:
To nie ma sensu PHP, bo
isset
iempty
są konstrukcje językowe, które akceptują tylko nazwy zmiennych. Nie ma sensu porównywanie wyników, ponieważ wynik jest tylko / już wartością logiczną.Mylące
>=
większe lub równe z=>
operatorem tablicyObaj operatorzy wyglądają nieco podobnie, więc czasami się mylą:
Trzeba tylko pamiętać, że ten operator porównania nazywa się „ większy lub równy ”, aby uzyskać właściwy wynik.
Zobacz także: Struktura instrukcji If w PHP
Nic do porównania
Nie można także łączyć dwóch porównań, jeśli dotyczą one tej samej nazwy zmiennej:
PHP nie może wywnioskować, że chciałeś ponownie porównać zmienną początkową. Wyrażenia są zwykle parowane zgodnie z pierwszeństwem operatora , więc do czasu ich
<
wyświetlenia pozostanie tylko wynik boolowski z oryginalnej zmiennej.Zobacz także: nieoczekiwany T_IS_SMALLER_OR_EQUAL
Łańcuchy porównawcze
Nie można porównywać ze zmienną z rzędem operatorów:
Trzeba to podzielić na dwa porównania, każde przeciw
$x
.W rzeczywistości jest to bardziej przypadek wyrażeń z czarnej listy (ze względu na równoważne powiązanie operatora). Jest poprawny pod względem składniowym w kilku językach w stylu C, ale PHP również nie interpretowałby tego jako oczekiwany łańcuch porównania.
Nieoczekiwany
>
Nieoczekiwany
<
Większe
>
lub mniejsze niż<
operatory nie mają niestandardowejT_XXX
nazwy tokenizera. I chociaż można je zgubić jak wszystkie inne, częściej parser narzeka na nie za błędnie napisane ciągi i maskowany HTML:Sprowadza się to
"<a href='z"
do porównania łańcucha>
ze stałą literalną,Hello
a następnie do kolejnego<
porównania. A przynajmniej tak to widzi PHP. Rzeczywistą przyczyną i błędem składni było przedwczesne"
zakończenie łańcucha .Nie można również zagnieżdżać znaczników startowych PHP:
Zobacz też:
źródło
Nieoczekiwany T_IF
Nieoczekiwany T_FOREACH
Nieoczekiwany T_FOR
Nieoczekiwany T_WHILE
Nieoczekiwany T_DO
Nieoczekiwany T_ECHO
Kontrola konstruuje takie jak
if
,foreach
,for
,while
,list
,global
,return
,do
,print
,echo
mogą być stosowane tylko jako stwierdzeń. Zwykle same przebywają na linii.Średnik; gdzie jesteś?
Całkiem ogólnie rzecz biorąc, czy pominąłeś średnik w poprzedniej linii, jeśli parser skarży się na instrukcję sterującą:
Rozwiązanie: spójrz na poprzednią linię; dodaj średnik.
Deklaracje klasowe
Innym miejscem, w którym ma to miejsce, są deklaracje klas . W sekcji klasy można wyświetlić tylko listę inicjalizacji właściwości i sekcji metod. Nie może tam znajdować się żaden kod.
Takie błędy składniowe często pojawiają się w przypadku nieprawidłowo zagnieżdżonych
{
i}
. W szczególności, gdy bloki kodu funkcji zostały zamknięte zbyt wcześnie.Instrukcje w kontekście wyrażeń
Większość konstrukcji językowych można używać tylko jako instrukcji . Nie należy ich umieszczać w innych wyrażeniach:
Podobnie nie możesz używać
if
w ciągach znaków, wyrażeniach matematycznych ani gdzie indziej:W przypadku
if
warunków osadzania w konkretnym wyrażeniu często chcesz użyć?:
oceny trójskładnikowej .To samo dotyczy
for
,while
,global
,echo
oraz w mniejszym stopniulist
.Natomiast
print()
jest językiem wbudowanym, który może być używany w kontekście wyrażeń. (Ale rzadko ma to sens).Zastrzeżone słowa kluczowe jako identyfikatory
Nie można także używać konstruktorów języka
do
aniif
innych języków dla funkcji zdefiniowanych przez użytkownika ani nazw klas. (Być może w PHP 7. Ale nawet wtedy nie byłoby wskazane.)źródło
Niespodziewany '?'
Jeśli próbujesz użyć zerowego operatora koalescencyjnego
??
w wersji PHP wcześniejszej niż PHP 7, pojawi się ten błąd.Nieoczekiwany „?”, Oczekiwanie zmiennej
Podobny błąd może wystąpić w przypadku typów zerowalnych, jak w:
Co ponownie oznacza, że używana jest nieaktualna wersja PHP (wersja CLI
php -v
lub wersja związana z serwerem WWWphpinfo();
).źródło
Nieoczekiwany T_LNUMBER
Token
T_LNUMBER
odnosi się do „długiego” / numeru.Niepoprawne nazwy zmiennych
W PHP i większości innych języków programowania zmienne nie mogą zaczynać się od liczby. Pierwszy znak musi być alfabetyczny lub podkreślić.
Dość często pojawia się użycie
preg_replace
-placeholder"$1"
w kontekście PHP:Gdzie należy oddzwonić. (Teraz
/e
flaga wyrażeń regularnych jest przestarzała. Ale czasami jest nadal niewłaściwie używana wpreg_replace_callback
funkcjach.)To samo ograniczenie identyfikatora dotyczy właściwości obiektu , btw.
Podczas gdy tokenizer / parser nie dopuszcza literału
$1
jako nazwy zmiennej, można użyć${1}
lub${"1"}
. Który jest obejściem składniowym dla niestandardowych identyfikatorów. (Najlepiej myśleć o tym jak o wyszukiwaniu lokalnego zasięgu. Ale ogólnie: w takich przypadkach preferuj zwykłe tablice!)Zabawnie, ale bardzo niezalecany, parser PHPs pozwala na identyfikatory Unicode; takie, które
$➊
byłyby ważne. (W przeciwieństwie do literału1
).Wpis tablicy bezpańskiej
W przypadku deklaracji tablicowych może wystąpić również nieoczekiwany długi czas - w przypadku braku
,
przecinków:Lub podobnie wywołania funkcji i deklaracje oraz inne konstrukcje:
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
Tak więc zwykle jest jedna z
;
lub,
brakująca do oddzielenia list lub wyrażeń.Błędnie cytowany HTML
I znowu źle napisane ciągi są częstym źródłem pomyłek:
Takie przypadki należy traktować mniej więcej tak, jak Nieoczekiwane błędy T_STRING .
Inne identyfikatory
Ani funkcji, klas, ani przestrzeni nazw nie można nazwać zaczynając od liczby:
Prawie tak samo jak w przypadku nazw zmiennych.
źródło
Nieoczekiwany „=”
Może to być spowodowane niepoprawnymi znakami w nazwie zmiennej. Nazwy zmiennych muszą być zgodne z następującymi regułami:
źródło
Nieoczekiwany „kontynuuj” (T_CONTINUE)
continue
jest instrukcją (jak dla lub jeśli) i musi wyglądać na samodzielną. Nie można go używać jako części wyrażenia. Częściowo dlatego, że kontynuacja nie zwraca wartości, ale w wyrażeniu każde podwyrażenie musi dawać pewną wartość, więc ogólne wyrażenie skutkuje wartością. Na tym polega różnica między wyrażeniem a wyrażeniem.Oznacza to, że
continue
nie można go użyć w trójkowej instrukcji ani w żadnej instrukcji wymagającej wartości zwracanej.Nieoczekiwana „przerwa” (T_BREAK)
To samo dotyczy
break;
oczywiście. Nie jest to również użyteczne w kontekście wyrażeń, ale ścisłe stwierdzenie (na tym samym poziomie coforeach
lubif
bloku).Nieoczekiwany „powrót” (T_RETURN)
Teraz może to być bardziej zaskakujące
return
, ale jest to również instrukcja blokowa . Zwraca wartość (lub NULL) do wyższego zakresu / funkcji, ale nie ocenia się jako samo wyrażenie. → To znaczy: nie ma sensu tego robićreturn(return(false);;
źródło
Niespodziewany '.'
Może się to zdarzyć, jeśli próbujesz użyć operatora splat (
...
) w nieobsługiwanej wersji PHP....
po raz pierwszy stał się dostępny w PHP 5.6 do przechwytywania zmiennej liczby argumentów dla funkcji:W PHP 7.4 możesz użyć go do wyrażeń Array .
źródło
Nieoczekiwany „koniec” (T_ENDWHILE)
Składnia używa dwukropka - jeśli nie ma dwukropka, wystąpi powyższy błąd.
Alternatywą dla tej składni jest użycie nawiasów klamrowych:
http://php.net/manual/en/control-structures.while.php
źródło
Komunikat o błędzie, który się zaczyna,
Parse error: syntax error, unexpected ':'
może być spowodowany błędnym zapisaniem statycznego odwołania klasyClass::$Variable
jakoClass:$Variable
.źródło