PHP parse / Błędy składniowe; i jak je rozwiązać

Każdy ma błędy składniowe. Nawet doświadczeni programiści popełniają literówki. Dla początkujących jest to tylko część procesu uczenia się. Jednak często łatwo jest zinterpretować komunikaty o błędach, takie jak:]}

PHP parse error: syntax error, unexpected ' {'in index.php on line 20

Nieoczekiwany symbol nie zawsze jest prawdziwym winowajcą. Ale numer linii daje przybliżony pomysł, od czego zacząć szukać.

Zawsze patrz na kod kontekst . Błąd składniowy często ukrywa się we wspomnianych lub w poprzednich liniach kodu. Porównaj swój kod z przykładami składni z podręcznika.

Chociaż nie każdy przypadek pasuje do drugiego. Jednak istnieją pewne ogólne kroki, aby rozwiązać błędy składniowe. To odniesienia podsumowały typowe pułapki:

Blisko spokrewnione odniesienia:

I:

Podczas gdy Stack Overflow jest również mile widziany przez początkujących programistów, jest głównie skierowany na profesjonalne pytania programistyczne.

  • odpowiadanie wszystkim za błędy w kodowaniu i wąskie literówki jest uważane za głównie off-topic.
  • więc proszę poświęcić trochę czasu, aby wykonać podstawowe kroki , przed wysłaniem żądania naprawy składni.
  • jeśli nadal musisz, pokaż swoją własną inicjatywę rozwiązywania problemów, próby poprawek i proces myślenia na temat tego, co wygląda lub może być błędne.

Jeśli twoja przeglądarka wyświetla komunikaty o błędach, takie jak " SyntaxError: illegal character", to właściwie nie jest to PHP -powiązane, ale javascript-błąd składni .


Błędy składni zgłoszone w kodzie dostawcy: na koniec, należy wziąć pod uwagę, że jeśli błąd składni nie został podniesiony przez edycję bazy kodu, ale po zainstalowaniu lub aktualizacji pakietu zewnętrznego dostawcy, może to być spowodowane niekompatybilnością wersji PHP, więc sprawdź wymagania dostawcy w odniesieniu do konfiguracji platformy.

Author: mario, 2013-08-05

20 answers

Jakie są Błędy składniowe?

PHP należy do C-style i imperatywne języki programowania. Ma sztywne reguły gramatyczne, od których nie może się odzyskać, gdy napotyka zagubione symbole lub identyfikatory. Nie zgadnie twoich intencji kodowania.

Definicja funkcji streszczenie składnia

Najważniejsze wskazówki

Istnieje kilka podstawowych środków ostrożności, które zawsze możesz podjąć:

  • Użyj właściwego wcięć kodu , lub Zaadoptuj dowolne wzniosłe styl kodowania. Czytelność zapobiega nieprawidłowościom.

  • Użyj IDE lub edytor dla PHP Z podświetleniem składni. Które również pomagają w wyrównywaniu nawiasów/nawiasów.

    Oczekiwano: średnik

  • Przeczytaj odniesienie do języka i przykłady w podręczniku. Dwa razy, aby stać się nieco biegłym.

Jak interpretować błędy parsera

Typowy komunikat o błędzie składni odsłon:

Parse error: syntax error, unexpected T_STRING, expecting ';' w pliku .php on line 217

Który wymieniamożliwe miejsce błędu składni. Zobacz wspomnianą nazwę pliku i numer linii .

A pseudonim taki jak T_STRING wyjaśnia, który symbol parser/tokenizer nie mógł ostatecznie przetworzyć. Nie jest to koniecznie przyczyna błąd składni.

Ważne jest, aby przyjrzeć się poprzednim liniom kodu . Często Błędy składniowe są tylko wpadkami, które wydarzyły się wcześniej. Numer linii błędu jest właśnie tam, gdzie parser ostatecznie zrezygnował, aby przetworzyć to wszystko.

Rozwiązywanie błędów składniowych

Istnieje wiele metod zawężania i naprawiania czkawki składniowej.

  • Otwórz wspomniany plik źródłowy. Spójrz na wspomniany kod linia .

    • W przypadku uciekających ciągów i zagubionych operatorów, to Zwykle miejsce, w którym znajduje się winowajca.

    • Przeczytaj linię od lewej do prawej i wyobraź sobie, co robi każdy symbol.

  • Bardziej regularnie musisz również patrzeć na poprzedzające linie .

    • W szczególności brakuje średników ; w poprzednim wierszu/instrukcji. (Przynajmniej z punktu widzenia stylistycznego. )

    • Jeśli { bloki kodu } są nieprawidłowo zamknięte lub zagnieżdżone, może być konieczne zbadanie jeszcze bardziej kodu źródłowego. Użyj właściwego wcięć kodu , aby to uprościć.

  • Spójrz na kolorowanie składni !

    • Łańcuchy, zmienne i stałe powinny mieć różne kolory.

    • Operatory +-*/. również powinny być przyciemniane. W przeciwnym razie mogą być w złym kontekst.

    • Jeśli widzisz, że kolorowanie ciągów jest zbyt długie lub zbyt krótkie, to znalazłeś nieoznaczony lub brakujący znacznik zamykający " lub '.

    • Posiadanie dwóch znaków interpunkcyjnych tego samego koloru obok siebie może również oznaczać kłopoty. Zazwyczaj operatorzy są samotni, jeśli nie ++, --, lub w nawiasach po operatorze. Dwa ciągi / identyfikatory bezpośrednio po sobie są nieprawidłowe W większości konteksty.

  • Whitespace jest twoim przyjacielem . Stosuj dowolny styl kodowania.

  • Chwilowo Przerwij długie kolejki.

    • Możesz dowolnie dodawać nowe linie pomiędzy operatorami lub stałymi a łańcuchami. Następnie parser konkretyzuje numer linii pod kątem błędów parsowania. Zamiast patrzeć na bardzo długi Kod, możesz wyizolować brakujący lub zagubiony symbol składni.

    • Split up złożone polecenia if w odrębne lub zagnieżdżone warunki if.

    • Zamiast długich formuł matematycznych lub łańcuchów logicznych, użyj zmiennych tymczasowych, aby uprościć kod. (Bardziej czytelny = mniej błędów.)

    • Dodaj nowe linie pomiędzy:

      1. kod można łatwo zidentyfikować jako poprawny,
      2. części, których nie jesteś pewien,
      3. i linie, na które skarży się parser.

      Partycjonowanie długich bloków kodu naprawdę pomaga zlokalizować pochodzenie błędów składniowych.

  • Skomentuj

    • 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 parsowania, znalazłeś źródło problemu. Przyjrzyj się bliżej.

    • Czasami chcesz tymczasowo usunąć pełną funkcję / metodę bloki. (W przypadku niezrównanych nawiasów klamrowych i nieprawidłowo 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ładniowych.

    • Operator ternary ? : condition może skompaktować kod i jest rzeczywiście użyteczny. Ale to nie pomaga czytelność we wszystkich przypadkach. Preferuj proste if wypowiedzi choć nieweryfikowalne.

    • Alternatywna składnia PHP(if:/elseif:/endif;) jest wspólne dla szablonów, ale prawdopodobnie mniej łatwe do naśladowania niż normalne { kod } bloków.

  • Najbardziej rozpowszechnione błędy nowicjusza to:

    • Brak średników ; do zakończenia instrukcji / linii.

    • Niedopasowane cytaty łańcuchowe dla " lub ' i unescaped cudzysłów wewnątrz.

    • Zapomniani operatorzy, w szczególny dla ciągu . konkatenacji.

    • Niesymetryczne ( nawiasy ). Policz je w zgłoszonej linii. Czy jest ich jednakowa liczba?

  • Nie zapominaj, że rozwiązanie jednego problemu składni może odkryć następny.

    • Jeśli sprawisz, że jeden problem zniknie, ale inne pojawią się w jakimś kodzie poniżej, jesteś w większości na właściwej ścieżce.

    • Jeśli po edycji pojawi się nowy błąd składni w tym samym linia, więc próba zmiany była prawdopodobnie porażką. (Nie zawsze jednak.)

  • Przywróć kopię zapasową wcześniej działającego kodu, jeśli nie możesz go naprawić.

    • przyjąć system wersjonowania kodu źródłowego. Zawsze możesz wyświetlić diff zepsutej i ostatniej działającej wersji. Co może być pouczające, na czym polega problem składni.
  • Invisible stray Unicode characters: W niektórych przypadkach musisz użyj hexeditora lub innego edytora / przeglądarki w źródle. Niektórych problemów nie można znaleźć po prostu patrząc na kod.

    • Spróbuj grep --color -P -n "\[\x80-\xFF\]" file.php jako pierwsza miara znajdująca symbole spoza ASCII.

    • W szczególności BM, spacje o zerowej szerokości lub spacje niełamliwe i cytaty smart regularnie mogą znaleźć się w kodzie źródłowym.

  • Zadbaj o to, które typy linebreaks są zapisywane w pliki.

    • PHP tylko honoruje \n nowe linie, a nie \r powroty karetki.

    • Co czasami jest problemem dla użytkowników MacOS (nawet na OS X dla źle skonfigurowanych edytorów).

    • Często pojawia się jako problem tylko wtedy, gdy używane są komentarze jednoliniowe // lub #. Komentarze Multiline /*...*/ rzadko przeszkadzają parserowi, gdy łamanie linii jest ignorowane.

  • Jeśli twój błąd składni nie przesyłać przez sieć : Zdarza się, że na komputerze występuje błąd składni. Ale umieszczenie tego samego pliku w internecie już go nie wyświetla. Co może oznaczać tylko jedną z dwóch rzeczy:

    • Patrzysz na zły plik!

    • Lub Twój kod zawierał niewidzialny Unicode (patrz wyżej). Możesz łatwo się dowiedzieć: wystarczy skopiować kod z formularza internetowego do edytora tekstu.

  • Sprawdź swoje PHP wersja . Nie wszystkie konstrukcje składniowe są dostępne na każdym serwerze.

    • php -v dla interpretera linii poleceń

    • <?php phpinfo(); dla tego wywołanego przez serwer WWW.


    to niekoniecznie 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 dla funkcji/metod, klas lub stałe.

  • Próba i błąd to Twoja ostatnia deska ratunku.

Jeśli Wszystko inne zawiedzie, zawsze możesz wygooglować swój komunikat o błędzie. Symbole składni nie są tak łatwe do wyszukiwania (Sam Stack Overflow jest indeksowany przez SymbolHound). Dlatego może potrwać przejrzenie kilku stron, zanim znajdziesz coś istotnego.

Dalsze Przewodniki:

Biały ekran śmierci

Jeśli Twoja strona jest po prostu puste, to zazwyczaj błąd składni jest przyczyną. Włącz ich wyświetlanie za pomocą:

  • error_reporting = E_ALL
  • display_errors = 1

W Twoim php.ini ogólnie, lub poprzez .htaccess dla mod_php, lub nawet .user.ini z ustawieniami FastCGI.

Włączenie go w zepsutym skrypcie jest za późno, ponieważ PHP nie potrafi nawet zinterpretować / uruchomić pierwszej linii. Szybkie obejście polega na stworzeniu skryptu owijarki, powiedzmy test.php:

<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

Następnie powołać się na porażkę Kod przez dostęp do tego skryptu.

Pomaga również włączyć error_log PHP i zajrzeć do twojego serwera error.log gdy skrypt ulega awarii z odpowiedziami HTTP 500.

 302
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-09 14:13:36

Myślę, że ten temat jest całkowicie overdyskussed/overcomplicated. Korzystanie z IDE jest sposobem, aby całkowicie uniknąć błędów składni. Powiedziałbym nawet, że praca bez IDE jest nieprofesjonalna. Dlaczego? Ponieważ nowoczesne IDE sprawdzają składnię po każdym wpisanym znaku. Kiedy kodujesz i cała linia zmienia kolor na czerwony, a Duże Ostrzeżenie pokazuje dokładny typ i dokładną pozycję błędu składni, nie ma absolutnie potrzeby wyszukiwania innego rozwiązanie.

Użycie IDE do sprawdzania składni oznacza:

Nigdy więcej nie napotkasz błędów składniowych, po prostu dlatego, że widzisz je dokładnie podczas pisania. Poważnie.

doskonałe IDE z sprawdzaniem składni (wszystkie są dostępne dla Systemów Linux, Windows i Mac):

  1. NetBeans [free]
  2. PHPStorm [$199 USD]
  3. Eclipse with PHP Plugin [free]
  4. Sublime [$80 USD] (głównie edytor tekstu, ale można go rozszerzyć za pomocą wtyczek, takich jak PHP Syntax Parser )
 116
Author: Sliq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Nieoczekiwane [

W dzisiejszych czasach nieoczekiwany nawias tablicy [ jest powszechnie widoczny w przestarzałych wersjach PHP. Składnia short array jest dostępna od PHP >= 5.4. Starsze instalacje obsługują tylko array().

$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
         ⇑

Dereferencja wyników funkcji tablicy jest również niedostępna dla starszych wersji PHP:

$result = get_whatever()["key"];
                      ⇑

Reference-co oznacza ten błąd w PHP? - "Błąd składni, nieoczekiwany \[" pokazuje najczęściej spotykane i praktyczne obejścia.

Chociaż, zawsze lepiej jest po prostu uaktualnić swoją instalację PHP. W przypadku wspólnych planów hostingu, najpierw sprawdź, czy np. SetHandler php56-fcgi Może być użyty do włączenia nowszego środowiska uruchomieniowego.

Zobacz też:

BTW, istnieją również preprocesory i PHP 5.4 syntax down-converters jeśli jesteś naprawdę przywiązany do starszych + wolniejszych wersji PHP.

Inne przyczyny nieoczekiwane [ składnia błędy

Jeśli nie jest to niedopasowanie wersji PHP, to często jest to zwykła literówka lub błąd składni nowoprzybyłej:]}
  • Nie możesz używać array property declarations/expressions w klasach, nawet w PHP 7.

    protected $var["x"] = "Nope";
                  ⇑
    
  • Mylenie {[10] } z otwartymi nawiasami klamrowymi { lub nawiasami ( jest powszechnym niedopatrzeniem.

    foreach [$a as $b)
            ⇑
    

    Lub nawet:

    function foobar[$a, $b, $c] {
                   ⇑
    
  • Lub próba dereferencji stałych (przed PHP 5.6) jako tablice:

    $var = const[123];
           ⇑
    

    Przynajmniej PHP interpretuje to const jako stałą nazwę.

    Jeśli chcesz uzyskać dostęp do zmiennej tablicy (która jest tutaj typową przyczyną), dodaj Sigil wiodący $ - tak, aby stał się $varname.

  • Próbujesz użyć słowa kluczowego global na elemencie tablicy asocjacyjnej. To nie jest poprawna składnia:

    global $var['key'];
    


Nieoczekiwane ] zamknięcie wspornik kwadratowy

To jest nieco rzadsze, ale zdarzają się też wypadki składniowe z nawiasami końcowymi ].

  • Znowu niedopasowania z ) nawiasy lub } klamry kręcone są powszechne:

    function foobar($a, $b, $c] {
                              ⇑
    
  • Lub próba zakończenia tablicy, w której jej nie ma:

    $var = 2];
    

    , który często występuje w wielowierszowych i zagnieżdżonych deklaracjach tablicy.

    $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
                                                 ⇑
    

    Jeśli Tak, użyj IDE do dopasowania nawiasów, aby znaleźć przedwczesne zamknięcie tablicy ]. Na najmniej użyj więcej odstępów i nowych linii, aby je zawęzić.

 59
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-02 12:26:17

Unexpected T_VARIABLE

"nieoczekiwany T_VARIABLE" oznacza, że istnieje literalna nazwa $variable, która nie pasuje do bieżącej struktury wyrażenia/instrukcji.

Operator abstrakcyjny / inexact + diagram zmiennej$

  1. Brak średnika

    Najczęściej oznacza brakujący średnik w poprzednim wierszu. Przypisania zmiennych po instrukcji są dobrym wskaźnikiem, gdzie szukać:

            ⇓
     func1()
     $var = 1 + 2;     # parse error in line +2
    
  2. Konkatenacja strun

    Częstym nieszczęściem są string concatenations with forgotten . operator:

                                    ⇓
     print "Here comes the value: "  $value;
    

    Btw, powinieneś preferować interpolację ciągu (podstawowe zmienne w podwójnych cudzysłowach), gdy tylko to pomaga w czytelności. Co pozwala uniknąć problemów ze składnią.

    Interpolacja łańcuchów jest podstawową cechą języka skryptowego. Nie ma się czego wstydzić. Ignoruj wszelkie porady mikro-optymalizacji o zmiennej . konkatenacja jest szybciej . to nie.

  3. Brak operatorów wyrażeń

    Oczywiście ten sam problem może pojawić się w innych wyrażeniach, na przykład w operacjach arytmetycznych:

                ⇓
     print 4 + 7 $var;
    

    PHP nie może odgadnąć tutaj, czy zmienna powinna być dodana, odejmowana lub porównywana itp.

  4. Listy

    To samo dla list składniowych, jak w populacjach tablic, gdzie parser wskazuje również oczekiwany przecinek ,, na przykład:

                                           ⇓
     $var = array("1" => $val, $val2, $val3 $val4);
    

    Lub funkcje Lista parametrów:

                                     ⇓
     function myfunc($param1, $param2 $param3, $param4)
    

    Równoważnie widzisz to w list lub global, lub gdy brakuje średnika ; W pętli for.

  5. Deklaracje klas

    Ten błąd parsera występuje również w deklaracjach klas . Można przypisać tylko stałe statyczne, a nie wyrażenia. W ten sposób parser narzeka na zmienne jako przypisane dane:

     class xyz {      ⇓
         var $value = $_GET["input"];
    

    Niezrównane } zamykanie kręconych szelek może w szczególności prowadzić tutaj. Jeśli metoda jest zakończona za wcześnie (użyj odpowiedniego wcięcia!), wtedy zmienna zbłąkana jest często błędnie umieszczana w ciele deklaracji klasy.

  6. Zmienne po identyfikatorach

    Możesz również nigdy nie mieć zmiennej podążającej za identyfikatorem bezpośrednio:

                  ⇓
     $this->myFunc$VAR();
    

    Btw, jest to częsty przykład, w którym intencją było użycie zmiennych zmiennych być może. W tym przypadku zmienna właściwość lookup z $this->{"myFunc$VAR"}(); na przykład.

    Weź pod uwagę, że używając zmiennej zmienne powinny być wyjątkiem. Nowicjusze często próbują używać ich zbyt przypadkowo, nawet gdy tablice byłyby prostsze i bardziej odpowiednie.

  7. Brak nawiasów po konstrukcjach językowych

    Szybkie pisanie może prowadzić do zapomnianego otwarcia lub zamknięcia nawiasu dla if i for i foreach wypowiedzi:

            ⇓
     foreach $array as $key) {
    

    Rozwiązanie: dodaj brakujące otwarcie ( pomiędzy instrukcją a zmienną.

                           ⇓
     if ($var = pdo_query($sql) {
          $result = …
    

    Klamra { nie otwiera kodu blokuje, bez zamykania wyrażenia if z ) jako pierwszym nawiasem zamykającym.

  8. Else nie oczekuje warunków

         ⇓
    else ($var >= 0)
    

    Rozwiązanie: Usuń Warunki z else lub użyj elseif.

  9. Potrzebujesz nawiasów do zamknięcia

         ⇓
    function() use $var {}
    

    Rozwiązanie: Dodaj nawiasy wokół $var.

  10. Invisible whitespace

    Jak wspomniano w reference answer na "Invisible stray Unicode" (takie jak non-breaking spacja ), możesz również zobaczyć ten błąd dla niczego nie podejrzewającego kodu, takiego jak:

    <?php
                              ⇐
    $var = new PDO(...);
    

    Jest to raczej powszechne na początku plików i do kopiowania i wklejania kodu. Sprawdź za pomocą hexeditora, czy Twój kod nie zawiera problemu ze składnią.

Zobacz też

 49
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-29 09:50:31

Unexpected T_constant_encapsed_string
Unexpected T_encapsed_and_whitespace

Nieprzydatne nazwy T_CONSTANT_ENCAPSED_STRING i T_ENCAPSED_AND_WHITESPACE odnoszą się do cytowanych "string" literały.

Są używane w różnych kontekstach, ale kwestia składni jest dość podobna. t_encapsed... Ostrzeżenia występują w kontekście podwójnego cytowanego ciągu znaków, podczas gdy t_constant... ciągi znaków są często mylone w prostych wyrażeniach lub instrukcjach PHP.

  1. Niepoprawne interpolacja zmienna

    I pojawia się najczęściej w przypadku nieprawidłowej interpolacji zmiennej PHP:

                              ⇓     ⇓
    echo "Here comes a $wrong['array'] access";
    

    Cytowanie kluczy tablic jest koniecznością w kontekście PHP. Ale w podwójnych cytowanych ciągach (lub HEREDOCs) jest to błąd. Parser narzeka na zawarty pojedynczy cytowany 'string', ponieważ zwykle oczekuje tam literalnego identyfikatora / klucza.

    Bardziej precyzyjnie należy używać prostej składni w stylu PHP2 w podwójnych cudzysłowach dla tablicy Bibliografia:

    echo "This is only $valid[here] ...";
    

    Zagnieżdżone tablice lub głębsze odniesienia do obiektów wymagają jednak złożonego, kręconego wyrażenia łańcuchowego składnia:

    echo "Use {$array['as_usual']} with curly syntax.";
    

    Jeśli nie jesteś pewien, jest to powszechnie bezpieczniejsze w użyciu. Często jest nawet uważany za bardziej czytelny. A lepsze IDE faktycznie używają do tego odrębnej koloryzacji składni.

  2. Brak konkatenacji

    Jeśli ciąg znaków podąża za wyrażeniem, ale nie ma konkatenacji lub innego operatora, to zobaczysz, że PHP skarży się na ciąg znaków:

                           ⇓
    print "Hello " . WORLD  " !";
    

    Chociaż jest to oczywiste dla Ciebie i dla mnie, PHP po prostu nie może zgadnąć że ciąg znaków miał być tam dołączony.

  3. Mylące cytaty ciągów

    Ten sam błąd składni występuje, gdy confounding string delimiters . Ciąg znaków rozpoczynający się pojedynczym ' lub podwójnym " cytatem również kończy się tym samym.

                    ⇓
    print "<a href="' . $link . '">click here</a>";
          ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟
    

    Ten przykład zaczynał się od podwójnych cudzysłowów. Ale podwójne cudzysłowy były również przeznaczone do HTML atrybuty. Zamierzony operator konkatenacji wewnątrz został jednak zinterpretowany jako część drugiego ciągu w pojedynczych cudzysłowach.

    Wskazówka: Ustaw swój edytor / IDE tak, aby używał lekko wyraźnej koloryzacji dla pojedynczych i podwójnych cytowanych ciągów. (Pomaga to również w logice aplikacji preferować np. podwójne cytowane ciągi dla wyjścia tekstowego, a pojedyncze cytowane ciągi tylko dla wartości podobnych do stałych.)

    Jest to dobry przykład, gdzie nie należy zrywać z podwójnym cytaty w pierwszej kolejności. Zamiast tego użyj proper \" escapes dla cudzysłowów atrybutów HTML:

    print "<a href=\"{$link}\">click here</a>";
    

    Chociaż może to również prowadzić do nieporozumień w składni, Wszystkie lepsze IDE/edytory ponownie pomagają, zmieniając koloryt cudzysłowów.

  4. Brak cytatu otwierającego

    Równoważnie są zapomniane otwarcie "/' cytaty przepis na błędy parsera:

                   ⇓
     make_url(login', 'open');
    

    Tutaj ', ' stałoby się ciągiem literalnym po bareword, gdy oczywiście login miał być parametrem string.

  5. Array lists

    Jeśli pominiesz , przecinek w bloku tworzenia tablicy, parser zobaczy dwa kolejne ciągi znaków:

    array(               ⇓
         "key" => "value"
         "next" => "....",
    );
    

    Zauważ, że ostatni wiersz może zawsze zawierać dodatkowy przecinek, ale pomijanie jednego pomiędzy jest niewybaczalne. Co jest trudne do odkrycia bez podświetlania składni.

  6. Listy parametrów funkcji

    To samo dla wywołania funkcji:

                             ⇓
    myfunc(123, "text", "and"  "more")
    
  7. Runaway strings

    Powszechną odmianą są po prostu zapomniane terminatory łańcuchów:

                                    ⇓
    mysql_evil("SELECT * FROM stuffs);
    print "'ok'";
          ⇑
    

    Tutaj PHP narzeka na dwa literały ciągów bezpośrednio po sobie. Ale prawdziwą przyczyną jest oczywiście nierozpoznany poprzedni ciąg.

Zobacz też

 32
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-25 01:32:32

Nieoczekiwany T_STRING

T_STRING to trochę mylne określenie. Nie odnosi się do cytowanego "string". Oznacza to, że napotkano surowy identyfikator. Może to obejmować słowa bare, resztki CONSTANT lub nazwy funkcji, zapomniane nienotowane ciągi znaków lub dowolny zwykły tekst.

  1. Źle cytowane ciągi

    Ten błąd składni jest jednak najczęściej spotykany w przypadku błędnie cytowanych wartości łańcuchowych. Każdy nieusuwalny i zabłąkany " lub ' cytat będzie stanowił nieważny wyrażenie:

                   ⇓                  ⇓
     echo "<a href="http://example.com">click here</a>";
    

    Podświetlanie składni sprawi, że takie błędy będą bardzo oczywiste. Ważne jest, aby pamiętać, aby używać odwrotnych ukośników do ucieczki \" podwójnych cudzysłowów lub \' pojedynczych cudzysłowów - w zależności od tego, który został użyty jako string enclosure.

    • dla wygody powinieneś preferować zewnętrzne pojedyncze cudzysłowy, gdy wypisujesz zwykły HTML z podwójnymi cudzysłowami.
    • użyj podwójnych cudzysłowów, jeśli chcesz interpolować zmienne, ale uważaj na znaki specjalne dosłowne " podwójne cudzysłowy.
    • dla dłuższego wyjścia, preferuj wielokrotne echo/print linie zamiast uciekać. Lepiej rozważ sekcję HEREDOC .


    Innym przykładem jest użycie wpisu PHP w kodzie HTML wygenerowanym za pomocą PHP:

    $text = '<div>some text with <?php echo 'some php entry' ?></div>'
    

    Dzieje się tak, jeśli $text jest duża z wieloma liniami, a programista nie widzi całej wartości zmiennej PHP i skupia się na fragmencie kodu zapominając o jego źródle. Przykładem jest tutaj

    Zobacz Jaka jest różnica między pojedynczo cytowanymi i Podwójnie cytowanymi łańcuchami w PHP?.

  2. Unclosed strings

    If you miss a closing " następnie błąd składni zazwyczaj materializuje się później. Untermined string często zużywa trochę kodu, aż do następnej zamierzonej wartości:

                                                           ⇓
    echo "Some text", $a_variable, "and some runaway string ;
    success("finished");
             ⇯
    

    To nie tylko dosłowne T_STRING, które parser może wtedy protestować. Inną częstą odmianą jest Unexpected '>' dla nienotowanego dosłownego HTML.

  3. Cudzysłowy bez programowania

    Jeśli skopiujesz i wkleisz kod z bloga lub strony internetowej, czasami kończysz z nieprawidłowym kodem. cytaty typograficzne nie są tego, czego oczekuje PHP:

    $text = ’Something something..’ + ”these ain't quotes”;
    

    Cytaty typograficzne/smart są symbolami Unicode. PHP traktuje je jako część sąsiadującego tekstu alfanumerycznego. Na przykład {[24] } jest interpretowany jako stały identyfikator. Ale każdy następujący tekst jest wtedy widoczny jako bareword / T_STRING przez parser.

  4. Brak średnika; znowu

    Jeśli masz nieterminowane wyrażenie w poprzednich wierszach, to każda następująca instrukcja lub konstrukcja języka będzie postrzegana jako surowy identyfikator:

           ⇓
    func1()
    function2();
    

    PHP po prostu nie może wiedzieć, czy chodziło Ci o uruchamianie dwóch funkcji po drugiej, czy o mnożenie ich wyników, dodawanie ich, porównywanie, czy tylko jedną || czy drugą.

  5. Krótkie otwarte znaczniki i <?xml nagłówki w Skrypty PHP

    To dość rzadkie. Ale jeśli short_open_tags są włączone, to nie możesz rozpocząć skryptów PHP z deklaracją XML :
          ⇓
    <?xml version="1.0"?>
    

    PHP zobaczy <? i odzyska je dla siebie. Nie zrozumie, do czego był przeznaczony zbłąkany xml. Zostanie zinterpretowana jako stała. Ale version będzie postrzegana jako inna literalna / stała. A ponieważ parser nie może mieć sensu dwóch kolejnych liter/wartości bez operatora wyrażenia pomiędzy, to będzie awaria parsera.

  6. Niewidzialne znaki Unicode

    Najbardziej ohydną przyczyną błędów składniowych są symbole Unicode, takie jak non-breaking space . PHP dopuszcza znaki Unicode jako nazwy identyfikatorów. Jeśli otrzymasz reklamację parsera t_string dla całkowicie niepomyślnego kodu, takiego jak:

    <?php
        print 123;
    

    Musisz uruchomić inny edytor tekstu. Albo nawet hexeditor. To, co wygląda jak zwykłe spacje i nowe linie, może zawierać niewidoczne stałe. IDE oparte na Javie są czasami nieświadome BOM UTF-8, spacji o zerowej szerokości, separatorów akapitów itp. Spróbuj ponownie edytować wszystko, usunąć białe spacje i dodać normalne spacje z powrotem.

    Można go zawęzić dodając redundantne separatory ; na początku każdego wiersza:

    <?php
        ;print 123;
    

    Dodatkowy średnik ; zamieni poprzedzający niewidoczny znak na nieokreśloną stałą referencję (wyrażenie jako polecenie). Co w zamian sprawia, że PHP produkuje pomocna informacja.

  7. Brak znaku `$` przed nazwami zmiennych

    Zmienne w PHP są reprezentowane przez znak dolara, po którym następuje nazwa zmiennej.

    Znak dolara ($) jest sigilem , który oznacza identyfikator jako nazwę zmiennej. Bez tego sigila, 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, który używa wpisanych zmiennych) może również wymknąć się i wytworzyć ten błąd.

  8. Unikalne cudzysłowy

    Jeśli używasz \ w łańcuchu znaków, ma to specjalne znaczenie. Jest to nazywane "Escape Character" i zwykle mówi parserowi, aby wziął następny znak dosłownie.

    Przykład: echo 'Jim said \'Hello\''; wydrukuje Jim said 'hello'

    Jeśli unikniesz zamykającego cytatu, cytat zamykający zostanie potraktowany dosłownie, a nie zgodnie z przeznaczeniem, tzn. jako drukowalny cytat jako część ciągu, a nie Zamknięcie ciągu. Będzie to wyświetlane jako błąd analizy zwykle po otwarciu następnego ciągu lub na końcu skryptu.

    Bardzo częsty błąd podczas określania ścieżek w systemie Windows: "C:\xampp\htdocs\" jest nieprawidłowy. Potrzebujesz "C:\\xampp\\htdocs\\".

  9. Wpisany właściwości

    Potrzebujesz PHP ≥7.4 aby używać typowania właściwości takich jak:

    public stdClass $obj;
    
 28
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-16 22:44:21

Nieoczekiwane (

Nawiasy otwierające zazwyczaj podążają za konstrukcjami językowymi, takimi jak if/foreach/for/array/list lub rozpocząć wyrażenie arytmetyczne. Są one niepoprawne składniowo po "strings", poprzednim (), samotnym $ oraz w niektórych typowych kontekstach deklaracji.

  1. Parametry deklaracji funkcji

    Rzadszym zjawiskiem dla tego błędu jest próba użycia wyrażeń jako domyślnych parametrów funkcji . To nie jest jest to bardzo proste i łatwe w obsłudze.]}

    function header_fallback($value, $expires = time() + 90000) {
    

    Parametry w deklaracji funkcji mogą być tylko wartościami literałnymi lub wyrażeniami stałymi. W przeciwieństwie do wywoływania funkcji, gdzie można dowolnie używać whatever(1+something()*2), itd.

  2. Class property defaults

    To samo dotyczy deklaracji członków klasy , gdzie dozwolone są tylko wartości dosłowne / stałe, a nie wyrażenia:

    class xyz {                   ⇓
        var $default = get_config("xyz_default");
    

    Umieść takie rzeczy w konstruktorze. Zobacz też dlaczego atrybuty PHP nie pozwalają funkcje?

    Ponownie zauważ, że PHP 7 zezwala tylko na wyrażenia stałe var $xy = 1 + 2 +3;.

  3. Składnia JavaScript w PHP

    Używanie JavaScript lub składnia jQuery nie będzie działać w PHP z oczywistych powodów:

    <?php      ⇓
        print $(document).text();
    

    Gdy tak się dzieje, zwykle wskazuje nieprzetworzony poprzedzający łańcuch; i literalne <script> sekcje wyciekające do kontekstu kodu PHP.

  4. Isset (()), empty, key, next, current

    Zarówno isset() i empty() są wbudowanymi językami, a nie funkcjami. Oni muszą uzyskać bezpośredni dostęp do zmiennej . Jeśli nieumyślnie dodasz za dużo pary nawiasów, utworzysz jednak wyrażenie: {]}

              ⇓
    if (isset(($_GET["id"]))) {
    

    To samo dotyczy każdego konstruktu językowego, który wymaga dostępu do niejawnej nazwy zmiennej. Te wbudowane elementy są częścią gramatyki języka, dlatego nie pozwalają na ozdobne dodatkowe nawiasy.

    Funkcje na poziomie użytkownika, które wymagają referencji zmiennej - ale dostają wynik wyrażenia przekazany-zamiast tego prowadzi do błędów runtime.


Nieoczekiwane )

  1. Brak parametru funkcji

    Nie możesz mieć bezpańskich przecinków jako ostatnich w wywołaniu funkcji . PHP oczekuje tam wartości i w ten sposób skarży się na wczesne zamknięcie nawiasu ).

                  ⇓
    callfunc(1, 2, );
    

    Końcowy przecinek jest dozwolony tylko w konstrukcjach array() lub list().

  2. Unfinished expressions

    Jeśli zapomnisz czegoś w wyrażeniu arytmetycznym, wtedy parser się poddaje. Ponieważ jak powinno to interpretować:

                   ⇓
    $var = 2 * (1 + );
    

    I jeśli zapomnisz nawet zamknięcia ), wtedy dostaniesz skargę na nieoczekiwany średnik zamiast.

  3. Foreach as constant

    For forgotten variable $ prefixes in control statements you will see:

                       ↓    ⇓
    foreach ($array as wrong) {
    

    PHP tutaj czasami mówi, że oczekuje :: zamiast. Ponieważ class::$variable mogła spełnić oczekiwane wyrażenie $variable..


Nieoczekiwane {

Klamry Kręcone { i } zawierają bloki kodu. Błędy składniowe zwykle wskazują na nieprawidłowe zagnieżdżanie.

  1. Niezrównane podwyrażenia w if

    Najczęściej niezrównoważony ( i ) są przyczyną, jeśli parser narzeka na otwierające się kręcone { pojawianie się za wcześnie. Prosty przykład:

                                  ⇓
    if (($x == $y) && (2 == true) {
    

    Policz nawiasy lub użyj IDE, które w tym pomaga. Również nie pisz kodu bez spacji. Liczy się czytelność.

  2. { i } w kontekście wyrażenia

    Nie możesz używać nawiasów klamrowych w wyrażeniach. Jeśli pomylisz nawiasy i zawiłości, nie będą one zgodne z gramatyką języka: {]}

               ⇓
    $var = 5 * {7 + $x};
    

    Istnieje kilka wyjątków dla konstrukcji identyfikatorów, takich jak zmienna local scope ${references}.

  3. Zmienne zmienne lub zmienne zmienne

    To dość rzadkie. Ale możesz również otrzymać skargi parsera dla złożonych wyrażeń zmiennych:
                          ⇓
    print "Hello {$world[2{]} !";
    
    Choć w takich sytuacjach jest większe prawdopodobieństwo nieoczekiwanego zdarzenia.


Nieoczekiwane }

Gdy pojawia się błąd "nieoczekiwany }", Zwykle zamykasz blok kodu wcześnie.

  1. Ostatnia wypowiedź w bloku kodu

    To może się zdarzyć dla każdego niezterminowanego wyrażenia.

    I jeśli ostatni wiersz w bloku funkcji / kodu nie ma końca ; średnika:

    function whatever() {
        doStuff()
    }            ⇧
    

    Tutaj parser nie może powiedzieć, czy być może nadal chcesz dodać + 25; do wyniku funkcji, czy coś innego.

  2. Nieprawidłowe zagnieżdżanie bloków / zapomniane {

    Czasami zobaczysz ten błąd parsera, gdy blok kodu był } zamknięte za wcześnie, albo zapomniałeś o otwarciu{ nawet:

    function doStuff() {
        if (true)    ⇦
            print "yes";
        }
    }   ⇧
    

    W powyższym fragmencie if nie miał otworu { kręcone klamry. W ten sposób zamknięcie } jeden poniżej stał się zbędny. I dlatego następne zamknięcie }, które było przeznaczone dla funkcji, nie było związane z oryginalnym otwarciem {.

    Takie błędy są jeszcze trudniejsze do znalezienia bez odpowiedniego wcięcia kodu. Użyj IDE i wspornika pasujące.


Nieoczekiwane {, oczekujące (

Konstrukcje językowe, które wymagają nagłówka condition / declaration i blok kodu wywoła ten błąd.

  1. Listy parametrów

    Na przykład błędne funkcje bez listy parametrów {[76] } są niedozwolone:

                     ⇓
    function whatever {
    }
    
  2. Warunki instrukcji kontroli

    I nie możesz mieć if bez warunku .

      ⇓
    if {
    }
    
    Co oczywiście nie ma sensu. To samo dotyczy zwykłych podejrzanych., for/foreach, while/do, itd.

    Jeśli masz ten konkretny błąd, zdecydowanie powinieneś znaleźć kilka ręcznych przykładów.

 19
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-25 01:46:25

Unexpected $end

Kiedy PHP mówi o " nieoczekiwanym $end", oznacza to, że Twój kod zakończył się przedwcześnie. (Wiadomość jest nieco myląca, gdy jest brana dosłownie. Nie chodzi o zmienną o nazwie "$end", jak czasami zakładają nowicjusze. Odnosi się do "końca pliku", EOF.)

Cause: Unbalanced { and } for code blocks / and function or class declarations.

To prawie zawsze o zaginionym } nawias klamrowy zamykający poprzednie bloki kodu.

  • Ponownie użyj odpowiedniego wcięcia, aby uniknąć takich problemów.

  • Użyj IDE z dopasowaniem nawiasów, aby dowiedzieć się, gdzie } jest źle. Istnieją skróty klawiaturowe w większości IDE i edytorów tekstu:

    • NetBeans, PhpStorm, Komodo: Ctrl[ i Ctrl]
    • Eclipse, Aptana: CtrlShiftP
    • Atom, Sublime: Ctrlm - Zend Studio CtrlM
    • Geany, Notepad++: CtrlB - Joe: CtrlG - Emacs: C-M-N - Vim: %

Większość IDE również podświetla pasujące szelki, nawiasy i nawiasy. Co ułatwia sprawdzenie ich korelacji:

Dopasowanie Bracket w IDE

Wyrażenia bezterminowe

I Unexpected $end błąd składni / parsera może również wystąpić dla wyrażeń lub wyrażeń nieterminalnych:

  • $var = func(1, ?>EOF

Więc najpierw spójrz na koniec skryptów. Końcowe ; jest często zbędne dla ostatniej instrukcji w dowolnym skrypcie PHP. Ale ty powinieneś go mieć. Właśnie dlatego, że zawęża takie kwestie składni w dół.

Indented HEREDOC markers

Innym częstym zjawiskiem są łańcuchy HEREDOC lub NOWDOC. Na znacznik zakończenia jest ignorowany ze spacjami wiodącymi, tabulatorami itp.:

print <<< END
    Content...
    Content....
  END;
# ↑ terminator isn't exactly at the line start

Dlatego parser zakłada, że łańcuch HEREDOC będzie kontynuowany do końca pliku (stąd "nieoczekiwany $end"). Prawie wszystkie IDE i edytory podświetlania składni sprawią, że będzie to oczywiste lub ostrzegać o tym.

Unikalne cudzysłowy

Jeśli używasz \ w łańcuchu znaków, ma ono specjalne znaczenie. Jest to tzw. "Escape Character" i zwykle mówi parserowi, aby wykonał następny charakter dosłownie.

Przykład: echo 'Jim said \'Hello\''; wydrukuje Jim said 'hello'

Jeśli unikniesz zamykającego cytatu, cytat zamykający zostanie potraktowany dosłownie, a nie zgodnie z przeznaczeniem, tzn. jako drukowalny cytat jako część ciągu, a nie Zamknięcie ciągu. Będzie to wyświetlane jako błąd analizy zwykle po otwarciu następnego ciągu lub na końcu skryptu.

Bardzo częsty błąd podczas określania ścieżek w systemie Windows: "C:\xampp\htdocs\" jest nieprawidłowy. Potrzebujesz "C:\\xampp\\htdocs\\".

Alternatywa składnia

Nieco rzadszy jest ten błąd składni podczas używania alternatywnej składni dla bloków instrukcji/kodu w szablonach. Używając na przykład if: i else: oraz brakującego endif;.

Zobacz też:

 14
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-19 03:18:23

Unexpected t_if
Unexpected t_elseif
Unexpected t_else
Unexpected T_ENDIF

Warunkowe bloki kontrolneif, elseif i else podążaj za prostą strukturą. Jeśli napotkasz błąd składni, najprawdopodobniej jest to niepoprawne zagnieżdżanie bloków → z brakującymi { nawiasami klamrowymi } - lub o jeden za dużo.

Tutaj wpisz opis obrazka

  1. Brak { lub } z powodu nieprawidłowego wcięcia

    Niedopasowane szelki kodowe są wspólne dla mniej dobrze sformatowanego kodu, takiego jak:

    if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
    ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
    

    Jeśli twój kod wygląda tak, zacznij od nowa! W przeciwnym razie nie da się tego naprawić ani tobie, ani nikomu innemu. Nie ma sensu pokazywać tego w Internecie, aby poprosić o pomoc.

    Możesz to naprawić tylko wtedy, gdy możesz wizualnie śledzić zagnieżdżoną strukturę i relację warunków if/else i ich { bloków kodu }. Użyj swojego IDE, aby sprawdzić, czy wszystkie są sparowane.

    if (true) {
         if (false) {
                  …
         }
         elseif ($whatever) {
             if ($something2) {
                 …
             } 
             else {
                 …
             }
         }
         else {
             …
         }
         if (false) {    //   a second `if` tree
             …
         }
         else {
             …
         }
    }
    elseif (false) {
        …
    }
    

    Any double } } nie tylko zamknie gałąź, ale także poprzednią strukturę warunków. Dlatego trzymaj się jednego stylu kodowania; nie mieszaj i dopasuj w zagnieżdżonych drzewach if/else.

    Oprócz spójności tutaj, okazuje się pomocne, aby uniknąć długotrwałych warunków. Użyj zmiennych tymczasowych lub funkcji, aby uniknąć nieczytelnych wyrażeń if.

  2. IF nie można używać wyrażeń

    Zaskakująco częstym błędem jest próba użycia if stwierdzenia w wyrażenie, takie jak instrukcja print:

                       ⇓
    echo "<a href='" . if ($link == "example.org") { echo …
    

    Co jest oczywiście nieważne.

    Możesz użyć trójwarstwowego warunkowego , ale uważaj na wpływ czytelności.

    echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
    

    W przeciwnym razie przerwij takie konstrukcje wyjściowe: użyj wielokrotności ifS I echoS .
    Jeszcze lepiej, Użyj zmiennych tymczasowych i umieść swoje warunki przed:

    if ($link) { $href = "yes"; } else { $href = "no"; }
    echo "<a href='$href'>Link</a>";
    

    Definiowanie funkcji lub metod w takich przypadkach często ma sens też.

    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 :

    $var = if ($x == $y) { "true" };
    

    , który jest strukturalnie identyczny z używaniem if w ciągu znaków konkatenacja / wyrażenie.

    • ale struktury kontrolne (if / foreach / while) nie mają "wyniku".
    • literalny ciąg "true" byłby również pustką oświadczenie.

    Będziesz musiał użyć przypisania w bloku kodu :

    if ($x == $y) { $var = "true"; }
    

    Alternatywnie, ucieknij się do trójkowego porównania.

    If in If

    You cannot nest an if w ramach warunku:

                        ⇓
    if ($x == true and (if $y != false)) { ... }
    

    , co jest oczywiście zbędne, ponieważ and (lub or) pozwala już na porównywanie łańcuchów.

  3. Zapomniane ; średniki

    Once więcej: każdy blok kontrolny musi być deklaracją. Jeśli poprzedni fragment kodu nie jest zakończony średnikiem, to jest to gwarantowany błąd składni:

                    ⇓
    $var = 1 + 2 + 3
    if (true) { … }
    

    Btw, ostatnia linijka w {…} bloku kodu też potrzebuje średnika.

  4. Średnik za wcześnie

    Teraz prawdopodobnie nie należy obwiniać określonego stylu kodowania, ponieważ pułapka ta jest zbyt łatwa do przeoczenia:]}
                ⇓
    if ($x == 5);
    {
        $y = 7;
    }
    else           ←
    {
        $x = -1;    
    }
    

    Co zdarza się częściej niż ty wyobraź sobie.

    • kiedy zakończysz if () wyrażenie z ; wykona polecenie void. ; staje się pustą {} własną!
    • blok {…} w ten sposób jest odłączony od if i zawsze będzie działał.
    • więc else nie ma już relacji do otwartego if konstruktu, dlatego prowadziłoby to do nieoczekiwanego błędu składni T_ELSE.

    Który również wyjaśnia podobnie subtelny zmiana tego błędu składni:

    if ($x) { x_is_true(); }; else { something_else(); };
    

    Gdzie ; po bloku kodu {…} kończy się całość if konstruować, zrywając składniowo gałąź else.

  5. Nie używać bloków kodu

    Składniowo można pominąć klamry kręcone {...} dla bloków kodu w if/elseif/else gałęzie. Co niestety jest stylem składniowym bardzo powszechnym dla nieweryfikowalnych programistów. (Przy fałszywym założeniu szybsze było wpisanie lub Czytaj).

    Jednak jest to bardzo prawdopodobne, aby potknąć się składni. Prędzej czy później dodatkowe stwierdzenia trafią do gałęzi if / else:

    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     ←
    else
        $z = 0;
    

    Ale aby faktycznie używać bloków kodu, można do have do napisania {...} oni jako tacy!

    Nawet doświadczeni programiści unikają tej bezczelnej składni, a przynajmniej zrozum to jako wyjątkowy wyjątek od reguły.

  6. Else / Elseif in wrong order

    Jedną rzeczą do przypomnienia jest warunkowy porządek , oczywiście.

    if ($a) { … }
    else { … }
    elseif ($b) { … }
    ↑
    

    Możesz mieć tyle elseifs ile chcesz, ale else musi być ostatnia . Tak to już jest.

  7. Deklaracje klas

    Jak wspomniano powyżej , nie możesz mieć instrukcji kontrolnych w deklaracji klasy:

    class xyz {
        if (true) {
            function ($var) {}
        }
    

    Albo zapomniałeś definicji funkcji, albo też zamknąłeś } wcześnie w takich przypadkach.

  8. Nieoczekiwane T_ELSEIF / T_ELSE

    Podczas mieszania PHP i HTML, zamknięcie } dla if/elseif musi znajdować się w tym samym bloku PHP <?php ?>, co następny elseif/else. To spowoduje błąd, ponieważ zamknięcie } dla if musi być częścią elseif:

    <?php if ($x) { ?>
        html
    <?php } ?>
    <?php elseif ($y) { ?>
        html
    <?php } ?>
    

    Prawidłowa forma <?php } elseif:

    <?php if ($x) { ?>
        html
    <?php } elseif ($y) { ?>
        html
    <?php } ?>
    

    Jest to mniej więcej odmiana nieprawidłowego wcięcia-prawdopodobnie często oparta na błędnych intencjach kodowania.
    Nie możesz mash innych stwierdzeń inbetween if oraz elseif/else żetony strukturalne:

    if (true) {
    }
    echo "in between";    ←
    elseif (false) {
    }
    ?> text <?php      ←
    else {
    }
    

    Albo może występować tylko w {…} blokach kodu, a nie pomiędzy tokenami struktury sterowania.

      To i tak nie miałoby sensu. To nie tak, że był jakiś" nieokreślony " stan, kiedy PHP przeskakuje między gałęziami if i else.
  9. musisz zdecydować, gdzie należy wydrukować instrukcje lub czy trzeba je powtórzyć w obu gałęziach.

  10. Nie można też część if / else pomiędzy różnymi strukturami sterowania:

    foreach ($array as $i) {
        if ($i) { … }
    }
    else { … }
    

    Nie ma relacji składniowej pomiędzy if a else. foreach zakres leksykalny kończy się na }, więc nie ma sensu kontynuować struktury if.

  11. T_ENDIF

    Jeśli pojawia się nieoczekiwany T_ENDIF, używasz alternatywnego stylu składni if:elseif:else:endif;. Powinieneś się nad tym zastanowić.

    • Częstą pułapką jest mylenie eerily podobnego : dwukropka dla; średnika . (Pokryte "średnikiem za wcześnie")

    • Ponieważ wcięcie jest trudniejsze do wyśledzenia w plikach szablonów, tym bardziej przy użyciu składni alternatywnej-jest prawdopodobne, że endif; nie pasuje do żadnego if:.

    • Za pomocą } endif; jest podwojony if-terminator.

    Podczas gdy "nieoczekiwany $koniec" jest zwykle ceną za zapomniane zamknięcie } kręcone klamry.

  12. Przypisanie a porównanie

    Nie jest to więc błąd składni, ale warto wspomnieć w tym kontekście:
           ⇓
    if ($x = true) { }
    else { do_false(); }
    

    To nie jest ==/=== porównanie, ale = przypisanie . Jest to dość subtelne i z łatwością doprowadzi niektórych użytkowników do bezradnie edytowania całych bloków warunkowych. Najpierw uważaj na niezamierzone zadania - gdy doświadczasz błędu logicznego / złego zachowania.

 14
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-10 20:01:53

Unexpected T_IS_EQUAL
Unexpected t_is_greater_or_equal
Unexpected t_is_identical
Unexpected t_is_not_equal
Unexpected t_is_not_identical
Unexpected T_IS_SMALLER_OR_EQUAL
Nieoczekiwane <
Unexpected >

Operatory porównawcze, takie jak ==, >=, ===, !=, <>, !== i <= lub < i > w większości powinny być używane tylko w wyrażeniach, takich jak wyrażenia if. Jeśli parser narzeka na nie, to często oznacza nieprawidłowe parowanie lub niedopasowanie ( ) rodzice wokół nich.

  1. Parens grupowanie

    W szczególności dla if wypowiedzi z wieloma porównaniami należy zadbać o poprawne policzenie nawiasów otwierających i zamykających :

                            ⇓
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          ↑
    

    Tutaj if warunek tutaj został już zakończony przez )

    Gdy twoje porównania staną się wystarczająco złożone, często pomaga podzielić je na wiele i zagnieżdżone if konstruuje raczej.

  2. Isset() ]}

    Pospolitym przybyszem jest pitfal próbuje połączyć isset() lub empty() z porównaniami:

                            ⇓
    if (empty($_POST["var"] == 1)) {
    

    Lub nawet:

                        ⇓
    if (isset($variable !== "value")) {
    

    To nie ma sensu dla PHP, ponieważ isset i empty są konstrukcjami językowymi, które akceptują tylko nazwy zmiennych. Nie ma sensu porównywać wyniku, ponieważ wyjście jest tylko / już logicznym.

  3. >= greater-or-equal with => array operator

    Oba operatory wyglądają nieco podobnie, więc czasami się mylą: {]}

             ⇓
    if ($var => 5) { ... }
    

    Musisz tylko pamiętać, że ten operator porównania nazywa się" większy niż lub równy", aby to zrobić.

    Zobacz także: If struktura instrukcji w PHP

  4. Nic do porównania

    Nie można również połączyć dwóch porównań, jeśli dotyczą tej samej zmiennej nazwa:

                     ⇓
    if ($xyz > 5 and < 100)
    

    PHP nie może wydedukować, że chodziło Ci o ponowne porównanie początkowej zmiennej. Wyrażenia są zwykle sparowane zgodnie z precedensem operatora , więc do czasu wyświetlenia < z oryginalnej zmiennej zostanie tylko wynik logiczny.

    Zobacz też: nieoczekiwany T_IS_SMALLER_OR_EQUAL

  5. Łańcuchy porównawcze

    Nie można porównywać ze zmienną z rzędem operatorów:

                      ⇓
     $reult = (5 < $x < 10);
    

    To musi być podzielone na dwa porównania, każde przeciw $x.

    Jest to bardziej przypadek wyrażeń na czarnej liście (ze względu na równoważną asocjację operatorów). Jest poprawny składniowo w kilku językach w stylu C, ale PHP nie zinterpretowałby go tak, jak oczekiwano.

  6. Nieoczekiwane >
    Unexpected <

    Większe niż > lub mniejsze niż < operatory nie mają niestandardowej nazwy tokenizera T_XXX. I choć mogą być zagubione jak wszystkie inne, częściej widzisz, że parser skarży się na nie za źle cytowane ciągi i zmiażdżony HTML: {]}

                            ⇓
    print "<a href='z">Hello</a>";
                     ↑
    

    Jest to ciąg "<a href='z" porównywany > do literalnej stałej Hello, a następnie kolejne porównanie <. A przynajmniej tak postrzega to PHP. Rzeczywistą przyczyną i błędem składniowym było przedwczesne zakończenie łańcucha ".

    Nie jest również możliwe zagnieżdżenie znaczników startowych PHP:

    <?php echo <?php my_func(); ?>
               ↑
    

Zobacz też:

 11
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-29 04:05:16

Nieoczekiwany T_IF
Unexpected t_foreach
Unexpected t_for
Unexpected t_while
Unexpected t_do
Unexpected T_ECHO

Konstrukcje sterujące, takie jak if, foreach, for, while, list, global, return, do, print, echo mogą być używane tylko jako oświadczenia. Zwykle przebywają na linii samodzielnie.

  1. Średnik; gdzie jesteś?

    Dość uniwersalnie czy przegapiłeś średnik w poprzedniej linijce, jeśli parser narzeka na instrukcję kontrolną:

                 ⇓
    $x = myfunc()
    if (true) {
    

    Rozwiązanie: spójrz w poprzedni wiersz; dodaj średnik.

  2. Deklaracje klas

    Innym miejscem, gdzie to się dzieje, jest w deklaracjach klas . W sekcji Klasa można wyświetlić tylko sekcje inicjalizacja właściwości i metody. Żaden kod nie może tam przebywać.

    class xyz {
        if (true) {}
        foreach ($var) {}
    

    Takie błędy składniowe często materializują się dla nieprawidłowo zagnieżdżonych { i }. W szczególności, gdy bloki kodu funkcji zamknęli za wcześnie.

  3. Wypowiedzi w kontekście wyrażenia

    Większość konstrukcji językowych może być używana tylko jako instrukcje . Nie są one przeznaczone do umieszczania wewnątrz innych wyrażeń: {]}

                       ⇓
    $var = array(1, 2, foreach($else as $_), 5, 6);
    

    Podobnie nie można używać if w łańcuchach, wyrażeniach matematycznych lub gdzie indziej:

                   ⇓
    print "Oh, " . if (true) { "you!" } . " won't work";
    // Use a ternary condition here instead, when versed enough.
    

    do osadzania if - podobnych warunków w wyrażeniu, często chcesz użyć ?: ocena trójstronna .

    Ten sam dotyczy for, while, global, echo i mniejsze rozszerzenie list.

              ⇓
    echo 123, echo 567, "huh?";
    

    Natomiast print() jest językiem wbudowanym, który może być używany w kontekście wyrażeń. (Ale rzadko ma to sens.)

  4. Zarezerwowane słowa kluczowe jako identyfikatory

    Nie można również używać do lub if i innych konstrukcji językowych dla funkcji zdefiniowanych przez użytkownika lub nazw klas. (Być może w PHP 7. Ale nawet wtedy nie byłoby to wskazane.)

  5. Masz pół-dwukropek zamiast dwukropka (:) lub nawias klamrowy ({) po bloku kontrolnym

    Struktury kontrolne są zwykle zawinięte w nawiasy klamrowe (ale dwukropki mogą być używane w alternatywnej składni), aby reprezentować ich zakres. Jeśli przypadkowo użyjesz dwukropka, przedwcześnie zamkniesz ten blok, w wyniku czego twoje oświadczenie końcowe wyświetli błąd.

    foreach ($errors as $error); <-- should be : or {
 11
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-16 23:28:33

Nieoczekiwane '?'

Jeśli próbujesz użyć operatora koalescencyjnego null ?? w wersji PHP przed PHP 7, otrzymasz ten błąd.

<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP

Nieoczekiwane '?', expecting variable

Podobny błąd może wystąpić dla typów nullable, jak w:

function add(?int $sum): ?int {

, które ponownie wskazuje na przestarzałą wersję PHP (albo wersję CLI {[3] } lub związaną z serwerem WWW phpinfo();).

 7
Author: John Conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Unexpected T_LNUMBER

Token T_LNUMBER odnosi się do" długiej " / liczby.

  1. 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ślenie.

    $1   // Bad
    $_1  // Good
    

    *

    • Dość często pojawia się za użycie preg_replace - placeholders "$1" W kontekście PHP:

      #                         ↓            ⇓  ↓
      preg_replace("/#(\w+)/e",  strtopupper($1) )
      

      Gdzie powinno być wywołanie zwrotne cytowany. (Teraz flaga regex /e została wycofana. Ale czasami nadal jest niewłaściwie używany w funkcjach preg_replace_callback.)

    • To samo ograniczenie identyfikatora dotyczy właściwości obiektu, btw.

             ↓
      $json->0->value
      
    • Podczas gdy tokenizer / parser nie pozwala na literalne $1 jako nazwę zmiennej, jeden może używać ${1} lub ${"1"}. Który jest składniowym obejściem dla niestandardowych identyfikatorów. (Najlepiej jest myśleć o tym jako o lokalnym przeszukiwaniu zakresu. Ale ogólnie: preferuj zwykłe tablice w takich przypadkach!)

    • Zabawny, ale bardzo Nie zalecany, parser PHPs pozwala na identyfikatory Unicode; takie, że $➊ byłby poprawny. (W przeciwieństwie do dosłownego 1).

  2. Wejście tablicy

    Nieoczekiwane długie mogą wystąpić również dla deklaracji array - gdy brakuje , przecinków:

    #            ↓ ↓
    $xy = array(1 2 3);
    

    Lub podobnie wywołania funkcji i deklaracje oraz inne konstrukty:

    • func(1, 2 3);
    • function xy($z 2);
    • for ($i=2 3<$z)

    Więc zwykle brakuje jednego z ; lub , do oddzielania list lub wyrażeń.

  3. Źle cytowany HTML

    I znowu, źle cytowane ciągi są częstym źródłem bezpańskich liczb:

    #                 ↓ ↓          
    echo "<td colspan="3">something bad</td>";
    

    Takie przypadki powinny być traktowane mniej więcej jak nieoczekiwane błędy T_STRING .

  4. Inne identyfikatory

    Ani funkcje, klasy, ani przestrzenie nazw nie mogą być nazwane począwszy od liczby:

             ↓
    function 123shop() {
    

    Prawie tak samo jak w przypadku nazw zmiennych.

 6
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 19:47:43

Unexpected '= '

Może to być spowodowane nieprawidłowymi znakami w nazwie zmiennej. Nazwy zmiennych MUSZĄ przestrzegać następujących zasad:

Nazwy zmiennych są zgodne z tymi samymi zasadami co inne etykiety w PHP. Poprawna nazwa zmiennej zaczyna się od litery lub podkreślenia, a następnie dowolnej liczby liter, cyfr lub podkreślenia. Jako wyrażenie regularne wyraża się w ten sposób: "[a-zA-z_\x7f - \xff] [a-zA-Z0-9_\x7f-\xff] * "

 2
Author: John Conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-29 02:22:47

Unexpected".'

Może to wystąpić, jeśli próbujesz użyć operatora splat(...) w nieobsługiwanej wersji PHP.

... pierwsze stało się dostępne w PHP 5.6, aby przechwycić zmienną liczbę argumentów do funkcji:

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

W PHP 7.4, można go używać do wyrażeń tablicowych .

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
 2
Author: John Conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Unexpected 'continue' (T_CONTINUE)

continue jest deklaracją (podobnie jak for lub if) I musi być samodzielna. Nie może być używany jako część wyrażenia. Częściowo dlatego, że continue nie zwraca wartości, ale w wyrażeniu każde pod-wyrażenie musi dawać jakąś wartość, więc ogólne wyrażenie daje wartość. Na tym polega różnica między wypowiedzią a wyrażeniem.

Oznacza to, że continue nie może być użyty w oświadczeniu trójkowym ani w żadnym oświadczeniu wymagającym zwrotu wartość.

Nieoczekiwany ' break '(T_BREAK)

To samo tyczy się break; oczywiście. Nie jest również użyteczny w kontekście wyrażeń, ale ścisła instrukcja (na tym samym poziomie co foreach lub blok if).

Unexpected ' return '(T_RETURN)

Teraz może to być bardziej zaskakujące dla return, ale jest to również tylko deklaracja blokowa . Zwraca wartość (lub NULL) do wyższego zakresu / funkcji, ale nie ocenia jako samo wyrażenie. → Czyli: nie ma point in doing return(return(false);;

 1
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 13:10:01

Unexpected ' endwhile '(T_ENDWHILE)

Składnia używa dwukropka - jeśli nie ma dwukropka, wystąpi powyższy błąd.

<?php while($query->fetch()): ?>
 ....
<?php endwhile; ?>

Alternatywą dla tej składni jest użycie nawiasów klamrowych:

<?php while($query->fetch()) { ?>
  ....
<?php } ?>

Http://php.net/manual/en/control-structures.while.php

 1
Author: mplungjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Komunikat o błędzie rozpoczynający się Parse error: syntax error, unexpected ':' może być spowodowany błędnym zapisaniem statycznej referencji klasy Class::$Variable jako Class:$Variable.

 0
Author: David Spector,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-20 12:36:41

Jeszcze jednym powodem wystąpienia tych błędów jest nieoczekiwana Biała spacja, jak podobne znaki z-w kodzie, linie kodu wydają się być idealne, ale zawierają pewne konkretne znaki, które są podobne do linii podziału, białych spacji lub tabulacji, ale nie są przetwarzane przez parser. Spotykam się z tym problemem, gdy próbuję umieścić kod ze strony internetowej do edytora kodu po prostu skopiuj wklej, widziałem ten błąd z definicją tablicy. wszystko wyglądało dobrze w definicji tablicy. I can ' t sort out prawy błąd, w końcu definiuję tę tablicę w jednej linii, a następnie błąd zniknął. następnie ponownie staram się, aby ta definicja wiele jak, ale ręcznie dodając break (Enter) dla każdego elementu tablicy i zapisał Plik tym razem nie błąd parsowania przez Edytor, a także nie ma błędu podczas jego uruchamiania. Na przykład napotkałem problem z tym urywkiem, który był na jednym blogu, w rzeczywistości nie mogę publikować tych urywków, ponieważ przepełnienie stosu już zna problem z kodem.

Potem po jej rozwiazaniu mój roboczy fragment jest, który wygląda podobnie z tym, który pokazuje błąd parsowania

Błąd składni, nieoczekiwany " auth "(T_CONSTANT_ENCAPSED_STRING), oczekiwanie ']'

    public $aliases = [
        'csrf'=> \CodeIgniter\Filters\CSRF::class,
        'toolbar'=> \CodeIgniter\Filters\DebugToolbar::class,
        'honeypot'=> \CodeIgniter\Filters\Honeypot::class,
        'auth' => \App\Filters\Auth::class,
];
 0
Author: swapnil akolkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-07 04:55:09

Unexpected':', expecting', 'or') '

W przypadku próby użycia nowej funkcji nazwanego parametru PHP 8 w wersji PHP

$table->string(column:'Name');

Rozwiązania:

  1. zaktualizuj swoją wersję PHP TP PHP 8.8.0 lub nowszą
  2. nie używaj nazwanych parametrów (przekaż parametry w kolejności, w jakiej są oczekiwane)
 -1
Author: John Conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-02 13:56:15