Ошибки синтаксиса PHP / синтаксиса; и как их решить?

Каждый сталкивается с синтаксическими ошибками {Даже опытные программисты делают typos} (новички это) только часть учебного процесса [Тем не менее] он часто легко интерпретирует сообщения об ошибках, такие как>

Ошибка PHP Parse: ошибка синтаксиса неожиданный,.; в индексе * php в строке 20

Неожиданный символ не всегда является настоящим преступником. Но номер строки дает приблизительное представление о том, где начать искать.

Всегда смотрите на контекст кода . Синтаксическая ошибка часто скрывается в упомянутых или в предыдущих строках кода . Сравните ваш код с примерами синтаксиса из руководства.

Хотя не каждый случай соответствует другому. Однако есть несколько общих шагов для решения синтаксических ошибок . Эти ссылки суммировали общие ошибки:

Близкие ссылки:

А также:

В то время как Stack Overflow также приветствует новичков-кодеров, он в основном нацелен на профессиональные вопросы программирования.

  • Ответ на все ошибки кодирования и узкие опечатки рассматриваются в основном вне темы.
  • Поэтому, пожалуйста, найдите время, чтобы выполнить основные шаги , прежде чем отправлять запросы на синтаксическое исправление.
  • /*...*/ вам по-прежнему нужно, пожалуйста, продемонстрировать свою собственную инициативу по решению, попытку исправления и ваш мыслительный процесс по тому, что выглядит или может быть неправильным.

error_reporting = E_ALL ваш браузер отображает сообщения об ошибках , такие как «SyntaxError: незаконный характер», то это на самом деле не о связанных, но - ошибка синтаксиса .


Синтаксические ошибки, возникающие в коде поставщика: Наконец, рассмотрим, что display_errors = 1 ошибка синтаксиса не была повышена путем редактирования вашей кодовой базы, но после установки или обновления пакета внешнего поставщика это может быть связано с несовместимостью версии PHP, поэтому проверьте требования поставщика к вашему платформы.

php,parsing,debugging,syntax-error,php,

525

Ответов: 14


Синтаксические ошибки, возникающие в коде поставщика: Наконец, рассмотрим, что display_errors = 1 ошибка синтаксиса не была повышена путем редактирования вашей кодовой базы, но после установки или обновления пакета внешнего поставщика это может быть связано с несовместимостью версии PHP, поэтому проверьте требования поставщика к вашему платформы.

14525
234 принят

Каковы синтаксические ошибки?

PHP принадлежит к языкам программирования C-стиля и императива . Он имеет жесткие правила грамматики, которые он не может восстановить после столкновения с неуместными символами или идентификаторами. Он не может угадать ваши намерения кодирования.

Function definition syntax abstract

Самые важные советы

Есть несколько основных мер предосторожности, которые вы всегда можете предпринять:

  • Используйте правильный отступ кода или используйте любой высокий стиль кодирования. Считываемость предотвращает нарушения.

  • Используйте IDE или редактор для PHP с подсветкой синтаксиса . Что также помогает с балансировкой скобок / скобок.

    Expected: semicolon

  • Прочтите ссылку на язык и примеры в руководстве. Дважды, чтобы стать достаточно опытным.

Как интерпретировать ошибки парсера

Типичное сообщение с синтаксической ошибкой гласит:

Ошибка анализа: синтаксическая ошибка, неожиданный T_STRING , ожидающий ' .user.ini' в файле.php в строке 217

В котором перечислены возможные места синтаксической ошибки. См. Указанное имя файла и номер строки .

Кличка , такие , как T_STRINGобъясняет , какой символ анализатор / токенизатор не смог обработать окончательно. Однако это не обязательно является причиной синтаксической ошибки.

Важно также изучить предыдущие строки кода . Часто синтаксические ошибки - это просто неудачи, которые произошли ранее. Номер строки ошибки - это то, где синтаксический анализатор окончательно отказался обрабатывать все это.

Устранение синтаксических ошибок

Существует множество подходов к сужению и исправлению синтаксических икота.

  • Откройте указанный исходный файл. Посмотрите на указанную строку кода .

    • Для убегающих строк и неуместных операторов это обычно означает, что вы находите виновника.

    • Прочитайте строку слева направо и представьте, что делает каждый символ.

  • Регулярно вы также должны смотреть на предыдущие строки .

    • В частности, отсутствующие test.phpточки с запятой отсутствуют в предыдущей строке end / statement. (По крайней мере, с стилистической точки зрения.)

    • Если блоки кода некорректно закрыты или вложены, вам может потребоваться еще более изучить исходный код. Для упрощения используйте правильный отступ кода .<?php error_reporting(E_ALL); ini_set("display_errors", 1); include("./broken-script.php");error_log

  • Посмотрите на раскраску синтаксиса !

    • Строки, переменные и константы должны иметь цвета с ошибкой.

    • Операторы также [должны быть тонированы. [они могут быть в неправильном контексте.

    • Если вы видите, что раскраска строк слишком длинная или слишком короткая, вы обнаружите скрытый или отсутствующий заголовок "или 'маркер строки.

    • Наличие двух одинаковых символов пунктуации рядом друг с другом также может означать проблему. Как правило, операторы одиночкой , если это не array(), --или круглые скобки после оператора. Две строки / идентификаторы, которые непосредственно следуют друг за другом, являются неправильными в большинстве контекстов.

  • Пробел - ваш друг . Следуйте любому стилю кодировки.

  • Временно разбить длинные линии.

    • Вы можете свободно добавлять новые строки между операторами или константами и строками. Затем анализатор конкретизирует номер строки для ошибок синтаксического анализа. Вместо того, чтобы смотреть на очень длинный код, вы можете выделить отсутствующий или неуместный синтаксический символ.

    • Разделение сложных ifоператоров на отдельные или вложенные ifусловия.

    • Вместо длинных математических формул или логических цепей используйте временные переменные для упрощения кода. (Более читаемый = меньше ошибок.)

    • Добавьте новые строки между:

      1. Код, который вы можете легко определить как правильно,
      2. Части, о которых вы не знаете,
      3. И строки, на которые жалуется парсер.

      Разделение длинных блоков кода действительно помогает найти происхождение ошибок синтаксиса.

  • Прокомментируйте код нарушения.

    • Если вы не можете изолировать источник проблемы, начните комментировать (и тем самым временно удалить) блоки кода.

    • Как только вы избавитесь от ошибки синтаксического анализа, вы обнаружили источник проблем. Посмотрите внимательно.

    • Иногда вы хотите временно удалить полные блоки функций / методов. (В случае непревзойденных фигурных скобок и кода с неправильным отступом).

    • Если вы не можете решить проблему синтаксиса, попробуйте переписать разделы с комментариями с нуля .

  • Как новичок, избегайте некоторых запутанных конструкций синтаксиса.

    • Оператор тернарного состояния может компактно кодировать код и действительно полезен. Но во всех случаях это не способствует удобочитаемости. Предпочитайте простые выражения, пока они не отображаются.$php53 = array(1, 2, 3); $php54 = [1, 2, 3]; ?if

    • Альтернативный синтаксис PHP ( / / ) распространен для шаблонов, но, возможно, менее прост в использовании, чем обычные кодовые блоки.$result = get_whatever()["key"]; ?[SetHandler php56-fcgi[protected $var["x"] = "Nope"; ?

  • Наиболее распространенными ошибками новичка являются:

    • Отсутствуют точки с запятой [для завершающих операторов / строк.

    • Неисправные строковые кавычки для "или или без 'кавычек внутри.

    • Забытые операторы, в частности для .конкатенации строк.

    • Несбалансированные (круглые скобки ). Подсчитайте их в строке отчета. Есть ли их равное число?

  • Не забывайте, что решение одной проблемы синтаксиса может выявить следующее.

    • Если вы делаете одну проблему, уходите, а другие появляются в некотором коде ниже, вы в основном находитесь на правильном пути.

    • Если после редактирования новая синтаксическая ошибка возникает в той же строке, ваше попытка изменения может быть неудачной. (Не всегда, хотя.)

  • Восстановите резервную копию ранее работающего кода, если вы не можете его исправить.

    • Принять систему управления версиями исходного кода. Вы всегда можете просмотреть diffнеисправную и последнюю рабочую версию. Что может быть полезным для понимания проблемы синтаксиса.
  • Невидимые бродячие символы Unicode : в некоторых случаях вам нужно использовать hexeditor или другой редактор / просмотрщик на вашем источнике. Некоторые проблемы не могут быть найдены только с точки зрения вашего кода.

    • Попробуйте {в качестве первой меры найти символы, отличные от ASCII.

    • В частности, спецификации, пробелы нулевой ширины или неразрывные пробелы, а также умные кавычки регулярно могут найти свой путь в исходный код.

  • Позаботьтесь о том, какие типы строк будут сохранены в файлах.

    • PHP просто чтит новые строки, а не возврат каретки.

    • Иногда это проблема для пользователей MacOS (даже для ОС (X для неправильно настроенных редакторов).

    • Это часто возникает только как проблема, когда используются однострочные //или #комментарии. Многострочные комментарии редко нарушают парсер, когда разрывы строк игнорируются.foreach [$a as $b) ?

  • Если ваша синтаксическая ошибка не передается через Интернет : бывает, что на вашем компьютере есть синтаксическая ошибка. Но публикация того же файла в Интернете больше не демонстрирует его. Что может означать только одно из двух:

    • Вы смотрите на неправильный файл!

    • Или ваш код содержит невидимый бездомный Unicode (см. Выше). Вы можете легко узнать: просто скопируйте свой код из веб-формы в текстовый редактор.

  • Проверьте свою версию PHP . Не все синтаксические конструкции доступны на каждом сервере.

  • Не используйте зарезервированные ключевые слова PHP как идентификаторы для функций / методов, классов или констант.

  • Trial-and-error - ваше последнее средство.

Если все остальное не удается, вы всегда можете отправить сообщение об ошибке. Символы синтаксиса не так легко найти (Stack Overflow сам индексируется SymbolHound, хотя). Поэтому перед тем, как найти что-то важное, вы можете просмотреть еще несколько страниц.

Дальнейшие руководства:

Белый экран смерти

Если ваш сайт просто пуст, то, как правило, причиной является синтаксическая ошибка. Включите их отображение:

  • function foobar[$a, $b, $c] { ?
  • $var = const[123]; ?

В constобщем, или $для mod_php, или даже $varnameс настройками FastCGI.

Включение его в сломанный скрипт слишком поздно, потому что PHP не может даже интерпретировать / запускать первую строку. Быстрое обходное решение создает сценарий оболочки, например ]:

]

Затем вызовите неисправный код, обратившись к этому сценарию оболочки.

Это также помогает включить PHP )и посмотреть на ваш веб-сервер,} когда скрипт выходит из строя с ответами HTTP 500.


97
+250

Я думаю, что эта тема полностью перегружена / сложна. Использование IDE - это способ избежать ошибок синтаксиса. Я бы даже сказал, что работа без IDE является непрофессиональной. Зачем? Поскольку современные IDE проверяют ваш синтаксис после каждого вводимого вами символа. Когда вы кодируете, и вся ваша строка становится красной, и большое предупреждение показывает вам точный тип и точное местоположение синтаксической ошибки, тогда нет абсолютно никакой необходимости искать другое решение.

Использование синтаксической проверки IDE означает:

Вы (эффективно) никогда не столкнетесь с синтаксическими ошибками снова, просто потому, что видите их правильно по мере ввода. Шутки в сторону.

Отличные IDE с проверкой синтаксиса (все они доступны для Linux, Windows и Mac):

  1. Функция NetBeans foobar ( $ a , $ b , $ c ] { ? Free $ var = 2 ];
  2. PHPStorm $ array = [ 1 , [ 2 , 3 ], 4 , [ 5 , 6 [ 7 , [ 8 ], [ 9 , 10 ]], 11 ], 12 ]], 15 ]; ? $ 199 USD]
  3. Eclipse с плагином PHP T_VARIABLEfree $ variable
  4. Возвышенный ? func1 () $ var = 1 + 2 ; # parse error in line +2 $ 80 USD] (в основном текстовый редактор, но расширяемый с помощью плагинов, например, PHP Syntax Parser )

46

непредвиденный [

В наши дни неожиданный [массив массивов обычно встречается на устаревших версиях PHP. Короткий синтаксис массив доступен , начиная с PHP > = 5.4 . Старые установки поддерживают только ..

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

Функция разыменования функции массива также недоступна для старых версий PHP:

.

Ссылка. Что означает эта ошибка в PHP? - «Синтаксическая ошибка, неожиданная » ? print 4 + 7 $var; показывает наиболее распространенные и практические обходные пути.

Хотя вам всегда лучше обновлять вашу установку PHP. Для общих планов веб-хостинга первое исследование, если, например, ,можно использовать для включения более новой среды выполнения.

Смотрите также:

Кстати, есть также препроцессоры и синтаксические понижающие преобразователи PHP 5.4, если вы действительно цепляетесь за более старые и медленные версии PHP.

Другие причины неожиданных[ синтаксических ошибок

Если это не рассогласование PHP-версии, то это часто случается с синтаксической ошибкой опечатки или новичка:

  • Вы не можете использовать объявления / выражения свойств массива в классах , даже в PHP 7.

                                    ?
    function myfunc($param1, $param2 $param3, $param4)
  • Путаница [с открытием фигурных скобок {или круглых скобок (является общим надзором.

    list

    Или даже:

    global
  • Или пытаемся разыменовать константы (до PHP 5.6) как массивы:

    ;

    По крайней мере PHP интерпретирует это constкак постоянное имя.

    Если вы хотите получить доступ к переменной массива (что является типичной причиной здесь), добавьте $старшую сигилу, чтобы она стала a for.


Неожиданная ] закрывающая квадратная скобка

Это несколько реже, но также есть синтаксические аварии с завершающим ]скобкой массива .

  • Опять же несоответствия с )круглыми скобками или фигурными скобками являются общими:class xyz { ? var $value = $_GET["input"];

    }
  • Или пытаемся закончить массив, где его нет:

                 ?
    $this->myFunc$VAR();

    Это часто встречается в объявлениях с несколькими строками и вложенными массивами.

    $this->{"myFunc$VAR"}();

    Если это так, используйте IDE для сопоставления скобок, чтобы найти какое-либо преждевременное ]закрытие массива. По крайней мере, используйте большее расстояние и новые строки, чтобы сузить его.


40

Неожиданный T_VARIABLE

«Неожиданное T_VARIABLE» означает, что существует буквальное ifимя, которое не вписывается в текущую структуру выражений / операторов.

purposefully abstract/inexact operator+foriable diagram

  1. Отсутствует точка с запятой

    Это чаще всего указывает на отсутствующую точку с запятой в предыдущей строке. Переменные присваивания, следующие за заявлением, являются хорошим показателем, на который следует обратить внимание:

    foreach
  2. Конкатенация строк

    A frequent mishap are string concatenations with forgotten . operator:

           ?
    foreach $array as $key) {

    Btw, you should prefer string interpolation (basic variables in double quotes) whenever that helps readability. Which avoids these syntax issues.

    String interpolation is a scripting language core feature. No shame in utilizing it. Ignore any micro-optimization advise about variable . concatenation being faster. It's not.

  3. Missing expression operators

    Of course the same issue can arise in other expressions, for instance arithmetic operations:

    (

    PHP can't guess here if the variable should have been added, subtracted or compared etc.

  4. Lists

    Same for syntax lists, like in array populations, where the parser also indicates an expected comma , for example:

         ?
    else ($var >= 0)

    Or functions parameter lists:

    else

    Equivalently do you see this with list or elseif statements, or when lacking a ; semicolon in a for loop.

  5. Class declarations

    This parser error also occurs in class declarations. You can only assign static constants, not expressions. Thus the parser complains about variables as assigned data:

         ?
    function() uses $var {}

    Unmatched } closing curly braces can in particular lead here. If a method is terminated too early (use proper indentation!), then a stray variable is commonly misplaced into the class declaration body.

  6. Variables after identifiers

    You can also never have a variable follow an identifier directly:

    $var

    Btw, this is a common example where the intention was to use variable variables perhaps. In this case a variable property lookup with <?php ? $var = new PDO(...); for example.

    Take in mind that using variable variables should be the exception. Newcomers often try to use them too casually, even when arrays would be simpler and more appropriate.

  7. Missing parens after language constructs

    Hasty typing may lead to forgotten opening parenthesis for if and for and T_CONSTANT_ENCAPSED_STRING statements:

    T_ENCAPSED_AND_WHITESPACE

    Solution: add the missing opening ( between statement and variable.

  8. Else does not expect conditions

    "string"

    Solution: Remove the conditions from else or use ? ? echo "Here comes a $wrong['array'] access";.php" rel="noreferrer">elseif.

  9. Need brackets for closure

    'string'

    Solution: Add brackets around $var.

  10. Invisible whitespace

    As mentioned in the reference answer on "Invisible stray Unicode" (such as a non-breaking space), you might also see this error for unsuspecting code like:

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

    It's rather prevalent in the start of files and for copy-and-pasted code. Check with a hexeditor, if your code does not visually appear to contain a syntax issue.

See also


31

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

The unwieldy names T_CONSTANT_ENCAPSED_STRING and T_ENCAPSED_AND_WHITESPACE refer to quoted ? print "Hello " . WORLD " !"; literals.

They're used in different contexts, but the syntax issue are quite similar. T_ENCAPSEDa€¦ warnings occur in double quoted string context, while T_CONSTANTa€¦ strings are often astray in plain PHP expressions or statements.

  1. Incorrect variable interpolation

    And it comes up most frequently for incorrect PHP variable interpolation:

    '

    Quoting arrays keys is a must in PHP context. But in double quoted strings (or HEREDOCs) this is a mistake. The parser complains about the contained single quoted ", because it usually expects a literal identifier / key there.

    More precisely it's valid to use PHP2-style simple syntax within double quotes for array references:

                    ?
    print "<a href="' . $link . '">click here</a>";
          ????????????????????????????????????????

    Nested arrays or deeper object references however require the complex curly string expression syntax:

    "

    If unsure, this is commonly safer to use. It's often even considered more readable. And better IDEs actually use distinct syntax colorization for that.

  2. Missing concatenation

    If a string follows an expression, but lacks a concatenation or other operator, then you'll see PHP complain about the string literal:

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

    While it's obvious to you and me, PHP just can't guess that the string was meant to be appended there.

  3. Confusing string quote enclosures

    The same syntax error occurs when confounding string delimiters. A string started by a single ' or double " quote also ends with the same.

    "

    That example started with double quotes. But double quotes were also destined for the HTML attributes. The intended concatenation operator within however became interpreted as part of a second string in single quotes.

    Tip: Set your editor/IDE to use slightly distinct colorization for single and double quoted strings. (It also helps with application logic to prefer e.g. double quoted strings for textual output, and single quoted strings only for constant-like values.)

    This is a good example where you shouldn't break out of double quotes in the first place. Instead just use proper ' escapes for the HTML attributes? quotes:

                   ?
     make_url(login', 'open');

    While this can also lead to syntax confusion, all better IDEs/editors again help by colorizing the escaped quotes differently.

  4. Missing opening quote

    Equivalently are forgotten opening "/' quotes a recipe for parser errors:

    ', '

    Here the login would become a string literal after a bareword, when obviously , was meant to be a string parameter.

  5. Array lists

    If you miss a , comma in an array creation block, the parser will see two consecutive strings:

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

    Note that the last line may always contain an extra comma, but overlooking one in between is unforgivable. Which is hard to discover without syntax highlighting.

  6. Function parameter lists

    Same thing for function calls:

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

    A common variation are quite simply forgotten string terminators:

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

    Here PHP complains about two string literals directly following each other. But the real cause is the unclosed previous string of course.

See also

php,parsing,debugging,syntax-error,php,
Похожие вопросы