Все сталкиваются с синтаксическими ошибками. Даже опытные программисты делают опечатки. Для новичков это просто часть учебного процесса. Тем не менее, часто легко интерпретировать сообщения об ошибках, такие как:
Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданное '{' в index.php в строке 20
Неожиданный символ не всегда настоящий преступник. Но номер строки дает приблизительное представление о том, с чего начать.
Всегда смотрите на контекст кода . Синтаксическая ошибка часто скрывается в упомянутых или в предыдущих строках кода . Сравните ваш код с примерами синтаксиса из руководства.
Хотя не каждый случай соответствует другому. Тем не менее, есть некоторые общие шаги для решения синтаксических ошибок . Эти ссылки суммировали общие подводные камни:
Неожиданный T_CONSTANT_ENCAPSED_STRING
Неожиданный T_ENCAPSED_AND_WHITESPACEНеожиданный символ на входе: '
\
' (ASCII = 92) состояние = 1Неожиданный
,
(запятая)Не ожидается
.
(период)Неожиданный
;
(точка с запятой)Неожиданный
*
(звездочка)Неожиданный
:
(двоеточие)Неожиданно
&
(передача по времени вызова по ссылке)
Тесно связанные ссылки:
- Что означает эта ошибка в PHP? (ошибки во время выполнения)
- Что означает этот символ в PHP? (языковые токены)
- Эти
“”
умные‘’
цитаты ничего не значат для PHP
А также:
- Руководство по PHP на php.net и его различные языковые токены
- Или введение в синтаксис Википедии на PHP .
- И, наконец, наш php tag-wiki, конечно.
В то время как Stack Overflow также приветствует новичков, он в основном предназначен для вопросов профессионального программирования.
- Отвечать на все ошибки кодирования и опечатки считается не по теме.
- Поэтому, пожалуйста, уделите время, чтобы выполнить основные шаги , прежде чем публиковать запросы на исправление синтаксиса.
- Если вам все еще нужно, пожалуйста, покажите свою собственную инициативу решения, предпринятые исправления и свой мыслительный процесс о том, что выглядит или может быть не так.
Если твой браузер отображает сообщения об ошибках, такие как «SyntaxError: недопустимый символ», то это на самом деле неPHPсвязанные, но Javascript- ошибка синтаксиса .
Синтаксические ошибки, возникающие в коде поставщика. Наконец, учтите, что если синтаксическая ошибка возникла не при редактировании базы кода, а после установки или обновления пакета внешнего поставщика, это может быть связано с несовместимостью версии PHP, поэтому проверьте требования поставщика к вашей платформе. настроить.
источник
T_IF / T_FOREACH / ...
блок. Хоть я и хотел составить более персонализированное резюме для вопросов IF / ELSE / ELSEIF.Ответы:
Каковы синтаксические ошибки?
PHP относится к С-стилю и императивным языкам программирования. У него есть жесткие правила грамматики, которые он не может восстановить при обнаружении неуместных символов или идентификаторов. Это не может угадать ваши намерения кодирования.
Самые важные советы
Есть несколько основных мер предосторожности, которые вы всегда можете предпринять:
Используйте правильные отступы кода или используйте любой высокий стиль кодирования. Читаемость предотвращает неровности.
Используйте IDE или редактор для PHP с подсветкой синтаксиса . Что также помогает с скобками / балансировкой скобок.
Прочитайте справочник по языку и примеры в руководстве. Дважды, чтобы стать несколько опытным.
Как интерпретировать ошибки парсера
Типичное сообщение об ошибке синтаксиса гласит:
Который перечисляет возможное местоположение синтаксической ошибки. Смотрите упомянутое имя файла и номер строки .
Кличка , такая , как
T_STRING
объясняет , какой символ анализатора / токенизатор не смог обработать окончательно. Однако это не обязательно является причиной синтаксической ошибки.Важно также рассмотреть предыдущие строки кода . Часто синтаксические ошибки - это просто неудачи, случившиеся ранее. Номер строки ошибки - именно то, где анализатор окончательно отказался от обработки всего этого.
Решение синтаксических ошибок
Есть много подходов, чтобы сузить и исправить синтаксические ошибки.
Откройте указанный исходный файл. Посмотрите на упомянутую строку кода .
Для убегающих строк и неуместных операторов, это обычно, где вы найдете виновника.
Прочитайте строку слева направо и представьте, что делает каждый символ.
Более регулярно вы должны смотреть и на предыдущие строки .
В частности, пропущенные
;
точки с запятой отсутствуют в предыдущем конце строки / оператора. (По крайней мере, со стилистической точки зрения.)Если
{
блоки кода}
неправильно закрыты или вложены, вам, возможно, придется изучить еще больше в исходном коде. Используйте правильный отступ кода, чтобы упростить это.Посмотрите на синтаксис раскраски !
Строки, переменные и константы должны иметь разные цвета.
Операторы также
+-*/.
должны быть четко окрашены. Иначе они могут быть в неправильном контексте.Если вы видите, что расцветка строки простирается слишком далеко или слишком коротко, значит, вы нашли неэкранированный или отсутствующий закрывающий
"
или'
строковый маркер.Наличие двух одинаковых знаков препинания рядом друг с другом также может означать проблемы. Как правило, операторы одиночкой , если это не
++
,--
или круглые скобки после оператора. Две строки / идентификаторы, непосредственно следующие друг за другом, неверны в большинстве контекстов.Пробел - твой друг . Следуйте любому стилю кодирования.
Временно разбить длинные очереди.
Вы можете свободно добавлять символы новой строки между операторами или константами и строками. Затем синтаксический анализатор конкретизирует номер строки для анализа ошибок. Вместо того, чтобы смотреть на очень длинный код, вы можете выделить пропущенный или неправильно расположенный синтаксический символ.
Разделите сложные
if
операторы на отдельные или вложенныеif
условия.Вместо длинных математических формул или логических цепочек используйте временные переменные для упрощения кода. (Более читабельно = меньше ошибок.)
Добавьте новые строки между:
Разделение длинных блоков кода действительно помогает определить источник синтаксических ошибок.
Закомментируйте оскорбительный код.
Если вы не можете изолировать источник проблемы, начните закомментировать (и, следовательно, временно удалить) блоки кода.
Как только вы избавились от ошибки синтаксического анализа, вы нашли источник проблемы. Посмотри внимательнее там.
Иногда вы хотите временно удалить завершенные функциональные / методические блоки. (В случае непревзойденных фигурных скобок и неверно с отступом кода.)
Если вы не можете решить проблему с синтаксисом, попробуйте переписать закомментированные разделы с нуля .
Как новичок, избегайте некоторых запутанных синтаксических конструкций.
Тернарный
? :
оператор условия может компактировать код и действительно полезен. Но это не помогает удобочитаемости во всех случаях. Предпочитаю простыеif
высказывания, пока не обращен.Альтернативный синтаксис PHP (
if:
/elseif:
/endif;
) является общим для шаблонов, но, возможно, менее прост для понимания, чем обычные блоки{
кода}
.Наиболее распространенные ошибки новичка:
Недостающие точки с запятой
;
для завершающих операторов / строк.Несоответствующие строковые кавычки для
"
или'
и неэкранированные кавычки внутри.Забытые операторы, в частности, для
.
конкатенации строк.Несбалансированные
(
скобки)
. Подсчитайте их в сообщенной строке. Есть ли их равное количество?Не забывайте, что решение одной синтаксической проблемы может раскрыть следующую.
Если вы решите одну проблему, но в следующем коде появится другая, вы в основном на правильном пути.
Если после редактирования новой синтаксической ошибки появляется в той же строке, то ваша попытка изменения была неудачной. (Не всегда, хотя.)
Восстановите резервную копию ранее работающего кода, если вы не можете это исправить.
diff
сломанную и последнюю рабочую версию. Что может быть полезным для понимания проблемы синтаксиса.Невидимые блуждающие символы Юникода : в некоторых случаях вам нужно использовать hexeditor или другой редактор / просмотрщик в вашем источнике. Некоторые проблемы не могут быть найдены только при просмотре вашего кода.
Попробуйте
grep --color -P -n "\[\x80-\xFF\]" file.php
в качестве первой меры найти не-ASCII символы.В частности, спецификации, пробелы нулевой ширины или неразрывные пробелы и регулярные умные кавычки могут найти свой путь в исходный код.
Позаботьтесь о том, какой тип переносов строк сохраняется в файлах.
PHP только чтит \nпереводы строки, а не \rвозврат каретки.
Что иногда является проблемой для пользователей MacOS (даже в OS X для неправильно настроенных редакторов).
Это часто появляется только как проблема, когда используются однострочные
//
или#
комментарии. Многострочные/*...*/
комментарии редко мешают анализатору, когда переводы строк игнорируются.Если ваша синтаксическая ошибка не передается через Интернет : случается, что у вас есть синтаксическая ошибка на вашем компьютере. Но размещение того же самого файла в Интернете больше не демонстрирует его. Что может означать только одну из двух вещей:
Вы смотрите не на тот файл!
Или ваш код содержал невидимый блуждающий Unicode (см. Выше). Вы можете легко узнать: просто скопируйте свой код обратно из веб-формы в текстовый редактор.
Проверьте свою версию PHP . Не все синтаксические конструкции доступны на каждом сервере.
php -v
для интерпретатора командной строки<?php phpinfo();
за тот, который вызывается через веб-сервер.Это не обязательно то же самое. В частности, при работе с фреймворками вы будете их сопоставлять.
Не используйте зарезервированные ключевые слова PHP в качестве идентификаторов для функций / методов, классов или констант.
Метод проб и ошибок - ваше последнее средство.
Если ничего не помогает, вы всегда можете погуглить ваше сообщение об ошибке. Синтаксические символы не так легко найти ( хотя переполнение стека индексируется SymbolHound ). Поэтому может потребоваться просмотреть еще несколько страниц, прежде чем вы найдете что-то актуальное.
Дальнейшие руководства:
Белый экран смерти
Если ваш сайт просто пустой, то причиной обычно является синтаксическая ошибка. Включить их отображение с помощью:
error_reporting = E_ALL
display_errors = 1
В вашей
php.ini
общем, или через.htaccess
mod_php, или даже.user.ini
с настройками FastCGI.Включение этого в сломанном скрипте слишком поздно, потому что PHP не может даже интерпретировать / запустить первую строку. Быстрый обходной путь - создание сценария оболочки, скажем
test.php
:Затем вызовите ошибочный код, обратившись к этому сценарию оболочки.
Это также помогает включить PHP
error_log
и просматривать ваш веб-серверerror.log
при сбое скрипта с ответами HTTP 500.источник
error_reporting(E_ALL | E_STRICT);
для более ранних версий PHPЯ думаю, что эта тема полностью переоценена / слишком сложна. Использование IDE - это ПУТЬ, чтобы полностью избежать любых синтаксических ошибок. Я бы даже сказал, что работать без IDE - это непрофессионально. Почему? Потому что современные IDE проверяют ваш синтаксис после каждого введенного вами символа. Когда вы кодируете, и вся ваша строка становится красной, а большое предупреждающее сообщение показывает точный тип и точное положение синтаксической ошибки, тогда совершенно не нужно искать другое решение.
Использование IDE для проверки синтаксиса означает:
Вы (эффективно) никогда не столкнетесь с синтаксическими ошибками снова, просто потому, что видите их правильно при вводе. Шутки в сторону.
Отличные IDE с проверкой синтаксиса (все они доступны для Linux, Windows и Mac):
источник
непредвиденный
[
В наши дни неожиданная
[
скобка массива обычно встречается в устаревших версиях PHP. Короткий синтаксис массив доступен , начиная с PHP > = 5.4 . Старые установки только поддерживаютarray()
.Разыменование результата функции массива также недоступно для более старых версий PHP:
Справка - Что означает эта ошибка в PHP? - «Синтаксическая ошибка, неожиданная
\[
» показывает наиболее распространенные и практические обходные пути.Тем не менее, вам всегда лучше просто обновить установку PHP. Для общих планов веб-хостинга, сначала исследуйте, если, например,
SetHandler php56-fcgi
может использоваться, чтобы включить более новую среду выполнения.Смотрите также:
Кстати, есть также препроцессоры и преобразователи синтаксиса PHP 5.4, если вы действительно цепляетесь за более старые + более медленные версии PHP.
Другие причины непредвиденных
[
синтаксических ошибокЕсли это не несоответствие версии PHP, то это часто простая синтаксическая ошибка или ошибка синтаксиса новичка:
Вы не можете использовать объявления / выражения свойств массива в классах , даже в PHP 7.
Запутывание
[
с открывающимися фигурными скобками{
или скобками(
является общим упущением.Или даже:
Или пытаться разыменовать константы (до PHP 5.6) как массивы:
По крайней мере, PHP интерпретирует это
const
как постоянное имя.Если вы хотели получить доступ к переменной массива (что является типичной причиной здесь), то добавьте
$
начальный символ - и он станет$varname
.Вы пытаетесь использовать
global
ключевое слово для члена ассоциативного массива. Это неверный синтаксис:Неожиданное
]
закрытие квадратной скобкиЭто несколько реже, но есть также синтаксические ошибки с
]
скобкой завершающего массива .Снова несоответствия с
)
круглыми или}
фигурными скобками являются общими:Или пытаться завершить массив, где его нет:
Что часто происходит в объявлениях многострочных и вложенных массивов.
Если это так, используйте IDE для сопоставления скобок, чтобы найти преждевременное
]
закрытие массива. По крайней мере, используйте больше пробелов и новых строк, чтобы сузить его.источник
Неожиданный T_VARIABLE
«Неожиданный
T_VARIABLE
» означает, что есть буквальное$variable
имя, которое не вписывается в текущую структуру выражения / оператора.Отсутствует точка с запятой
Это чаще всего указывает на пропущенную точку с запятой в предыдущей строке. Назначение переменных после оператора является хорошим показателем того, где искать:
Конкатенация строк
Частая ошибка - это конкатенация строк с забытым
.
оператором:Кстати, вы должны предпочесть интерполяцию строк (базовые переменные в двойных кавычках) всякий раз, когда это помогает удобочитаемости. Что позволяет избежать этих проблем с синтаксисом.
Пропущенные операторы выражений
Конечно, та же проблема может возникнуть в других выражениях, например, арифметических операциях:
PHP не может угадать, должна ли переменная быть добавлена, вычтена или сравнена и т. Д.
Списки
То же самое для списков синтаксиса, как в массивах, где анализатор также указывает ожидаемую запятую,
,
например:Или списки параметров функций:
Эквивалентно ли вы видите это с помощью
list
илиglobal
операторов, или когда отсутствует;
точка с запятой вfor
цикле.Объявления класса
Эта ошибка синтаксического анализатора также возникает в объявлениях классов . Вы можете назначать только статические константы, а не выражения. Таким образом, парсер жалуется на переменные как назначенные данные:
Непревзойденные
}
закрывающие фигурные скобки могут, в частности, привести здесь. Если метод завершается слишком рано (используйте правильный отступ!), То переменная-переменная обычно помещается в тело объявления класса.Переменные после идентификаторов
Вы также никогда не сможете, чтобы переменная следовала непосредственно за идентификатором :
Кстати, это распространенный пример, где целью было использование переменных переменных, возможно. В этом случае поиск свойства переменной,
$this->{"myFunc$VAR"}();
например.Отсутствующие скобки после языковых конструкций
Поспешная типизация может привести к тому, что забытые открывающие или закрывающие скобки для операторов
if
andfor
иforeach
:Решение: добавить пропущенное отверстие
(
между оператором и переменной.Фигурная
{
скобка не открывает блок кода, не закрывая сначалаif
выражение с)
закрывающей скобкой.Остальное не ожидает условий
Решение: Удалить условия
else
или использоватьelseif
.Нужны скобки для закрытия
Решение: Добавьте скобки вокруг
$var
.Невидимый пробел
Как упоминалось в справочном ответе «Невидимый блуждающий Unicode» (например, неразрывный пробел ), вы также можете увидеть эту ошибку для ничего не подозревающего кода, например:
Это довольно распространено в начале файлов и для копирования и вставки кода. Проверьте с помощью hexeditor, если ваш код визуально не содержит синтаксических проблем.
Смотрите также
источник
Неожиданный T_CONSTANT_ENCAPSED_STRING
Неожиданный T_ENCAPSED_AND_WHITESPACE
Громоздкие имена
T_CONSTANT_ENCAPSED_STRING
иT_ENCAPSED_AND_WHITESPACE
ссылки на цитируемые литералы ."string"
Они используются в разных контекстах, но проблема синтаксиса очень похожа. T_ENCAPSED… предупреждения появляются в строковом контексте в двойных кавычках, в то время как строки T_CONSTANT… часто ошибочны в простых выражениях или операторах PHP.
Неверная интерполяция переменных
И это чаще всего встречается при неправильной интерполяции переменных PHP:
Кавычки массивов ключей являются обязательными в контексте PHP. Но в двойных кавычках (или HEREDOCs) это ошибка. Синтаксический анализатор жалуется на заключенные в кавычки
'string'
, потому что он обычно ожидает буквальный идентификатор / ключ.Точнее, для ссылок на массивы допустимо использовать простой синтаксис в стиле PHP2 в двойных кавычках :
Однако для вложенных массивов или более глубоких ссылок на объекты требуется сложный синтаксис фигурных строковых выражений :
Если не уверены, это обычно безопаснее использовать. Это часто даже считается более читабельным. И лучшие IDE на самом деле используют для этого разные цвета синтаксиса.
Отсутствует сцепление
Если строка следует за выражением, но не имеет конкатенации или другого оператора, вы увидите, что PHP жалуется на строковый литерал:
Хотя это очевидно для вас и меня, PHP просто не может догадаться, что строка должна была быть добавлена туда.
Смешение строк в кавычках
Та же самая синтаксическая ошибка возникает при смешивании разделителей строк . Строка, начинающаяся с одинарной
'
или двойной"
кавычки, также заканчивается тем же.Этот пример начался с двойных кавычек. Но двойные кавычки были также предназначены для атрибутов HTML. Однако предполагаемый оператор конкатенации внутри стал интерпретироваться как часть второй строки в одинарных кавычках.
Это хороший пример, где вы не должны в первую очередь вырываться из двойных кавычек. Вместо этого просто используйте правильные
\"
escape-символы для кавычек атрибутов HTML:Хотя это также может привести к путанице в синтаксисе, все лучшие IDE / редакторы снова помогают, окрашивая экранированные кавычки по-разному.
Отсутствует вводная цитата
Эквивалентно забываемому открытию
"
/'
цитированию рецепт ошибок парсера:Здесь
', '
он станет строковым литералом после голого слова, когда, очевидно,login
должен был быть строковым параметром.Списки массивов
Если вы пропустите
,
запятую в блоке создания массива, парсер увидит две последовательные строки:Обратите внимание, что последняя строка может всегда содержать лишнюю запятую, но пропуск одной промежуточной строки непростителен. Который трудно обнаружить без подсветки синтаксиса.
Списки параметров функции
То же самое для вызовов функций :
Беглые строки
Распространенным вариантом являются просто забытые терминаторы строк:
Здесь PHP жалуется на два строковых литерала, непосредственно следующих друг за другом. Но настоящая причина, конечно, в незакрытой предыдущей строке.
Смотрите также
источник
Неожиданный T_STRING
T_STRING
это немного неправильно. Это не относится к цитируемому"string"
. Это означает, что был обнаружен необработанный идентификатор. Это может варьироваться отbare
слов до оставшихсяCONSTANT
или имен функций, забытых строк без кавычек или любого простого текста.Ошибочные строки
Однако эта синтаксическая ошибка наиболее распространена для неверно цитируемых строковых значений. Любые unescaped и беспризорные
"
или'
цитаты сформируют недопустимое выражениеПодсветка синтаксиса сделает такие ошибки супер очевидными. Важно не забывать использовать обратную косую черту для экранирования
\"
двойных кавычек или\'
одинарных кавычек - в зависимости от того, какая строка использовалась в качестве вложенной строки ."
двойных кавычек.echo
/print
линии вместо побега в и. Еще лучше рассмотреть раздел HEREDOC .Другой пример - использование записи PHP внутри HTML-кода, созданного с помощью PHP:
Это происходит, если
$text
он большой и содержит много строк, и разработчик не видит всего значения переменной PHP и сосредотачивается на части кода, забывая об ее источнике. Пример здесьСмотрите также В чем разница между одинарными и двойными кавычками в PHP? ,
Незакрытые строки
Если вы пропустите закрытие,
"
то синтаксическая ошибка обычно возникает позже. Неопределенная строка часто потребляет немного кода до следующего предполагаемого строкового значения:Тогда
T_STRING
парсер может протестовать не только буквально . Еще один частый вариант - этоUnexpected '>'
буквальный HTML без кавычек.Непрограммирующие строковые кавычки
Если вы копируете и вставляете код из блога или веб-сайта, у вас иногда получается неверный код. Типографские кавычки - это не то, что ожидает PHP:
Типографские / умные кавычки являются символами Юникода. PHP рассматривает их как часть буквенно-цифрового текста. Например
”these
, интерпретируется как постоянный идентификатор. Но любой последующий текстовый литерал затем рассматривается синтаксическим анализатором как голое слово / T_STRING.Пропущенная точка с запятой; снова
Если у вас есть неопределенное выражение в предыдущих строках, то любой следующий оператор или языковая конструкция будет рассматриваться как необработанный идентификатор:
PHP просто не может знать, хотели ли вы запускать две функции за другой, или вы хотели умножить их результаты, добавить их, сравнить их или запустить только одну
||
или другую.Короткие открытые теги и
<?xml
заголовки в скриптах PHPЭто довольно необычно. Но если включены short_open_tags, вы не можете начать свои PHP-скрипты с объявления XML :
PHP увидит
<?
и исправит это для себя. Он не поймет, для чего предназначался шальнойxml
. Это будет интерпретировано как константа. Ноversion
будет рассматриваться как еще один буквальный / постоянный. А поскольку синтаксический анализатор не может иметь смысла двух последующих литералов / значений без оператора выражения между ними, это будет ошибкой синтаксического анализатора.Невидимые символы Юникода
Наиболее отвратительной причиной синтаксических ошибок являются символы Юникода, такие как неразрывный пробел . PHP допускает использование символов Юникода в качестве имен идентификаторов. Если вы получили жалобу парсера T_STRING на совершенно неожиданный код, такой как:
Вам нужно вырвать другой текстовый редактор. Или даже гекседитор. То, что здесь выглядит как простые пробелы и символы новой строки, может содержать невидимые константы. Основанные на Java IDE иногда забывают о спецификации UTF-8, искривленной внутри, пробелах нулевой ширины, разделителях абзацев и т. Д. Попробуйте переопределить все, удалить пробелы и добавить в них нормальные пробелы.
Вы можете сузить это с добавлением избыточных
;
разделителей операторов в начале каждой строки:Дополнительная
;
точка с запятой здесь преобразует предыдущий невидимый символ в неопределенную константную ссылку (выражение как выражение). Что, в свою очередь, заставляет PHP создавать полезное уведомление.Знак `$` отсутствует перед именами переменных
Переменные в PHP представлены знаком доллара, за которым следует имя переменной.
Знак доллара (
$
) - это символ, который отмечает идентификатор как имя переменной. Без этого символа идентификатор может быть ключевым словом языка или константой .Это распространенная ошибка, когда код PHP был «переведен» из кода, написанного на другом языке (C, Java, JavaScript и т. Д.). В таких случаях объявление типа переменной (когда исходный код был написан на языке, использующем типизированные переменные) также может ускользнуть и вызвать эту ошибку.
Избежавшие кавычки
Если вы используете
\
в строке, это имеет особое значение. Это называется « Escape Character » и обычно говорит парсеру буквально брать следующий символ.Пример:
echo 'Jim said \'Hello\'';
напечатаетJim said 'hello'
Если вы избегаете закрывающей кавычки строки, закрывающая кавычка будет воспринята буквально, а не так, как предполагалось, то есть как печатная кавычка как часть строки, а не как закрывающая строка. Обычно это будет отображаться как ошибка разбора после открытия следующей строки или в конце скрипта.
Очень распространенная ошибка при указании путей в Windows:
"C:\xampp\htdocs\"
неверно. Вам нужно"C:\\xampp\\htdocs\\"
.источник
непредвиденный
(
Открывающие скобки обычно следуют за языковыми конструкциями, такими как
if
/foreach
/for
/array
/list
или начинают арифметическое выражение. Они синтаксически некорректны после"strings"
, предыдущего()
, одинокого$
и в некоторых типичных контекстах объявления.Параметры объявления функции
Более редкое вхождение для этой ошибки пытается использовать выражения в качестве параметров функции по умолчанию . Это не поддерживается даже в PHP7:
Параметры в объявлении функции могут быть только литеральными значениями или константными выражениями. В отличие от вызовов функций, где вы можете свободно использовать
whatever(1+something()*2)
и т. Д.Свойства класса по умолчанию
То же самое для объявлений членов класса , где допускаются только литеральные / константные значения, а не выражения:
Поместите такие вещи в конструктор. См. Также Почему атрибуты PHP не разрешают функции?
Еще раз обратите внимание, что PHP 7 допускает только
var $xy = 1 + 2 +3;
постоянные выражения там.Синтаксис JavaScript в PHP
Использование синтаксиса JavaScript или jQuery не будет работать в PHP по понятным причинам:
Когда это происходит, это обычно указывает на неопределенную предшествующую строку; и буквальные
<script>
разделы просачиваются в контекст кода PHP.isset (()), пустой, ключ, следующий, текущий
Оба
isset()
иempty()
являются встроенными языками, а не функциями. Им нужно получить доступ к переменной напрямую . Если вы ненароком добавите пару скобок слишком много, то вы создадите выражение:То же самое относится к любой языковой конструкции, которая требует неявного доступа к имени переменной. Эти встроенные элементы являются частью грамматики языка, поэтому не допускают использование дополнительных круглых скобок.
Функции пользовательского уровня, которым требуется ссылка на переменную - но получают переданный результат выражения - приводят к ошибкам во время выполнения.
непредвиденный
)
Отсутствующий параметр функции
Вы не можете иметь запятые в конце вызова функции . PHP ожидает значения и поэтому жалуется на закрывающую
)
скобку.Завершающая запятая допускается только в конструкции
array()
илиlist()
.Незаконченные выражения
Если вы что-то забудете в арифметическом выражении, то парсер сдастся. Потому что как это должно интерпретировать это:
И если вы забудете
)
даже закрытие , вы получите жалобу на неожиданную точку с запятой.Foreach как
constant
Для забытых
$
префиксов переменных в управляющих операторах вы увидите:PHP здесь иногда говорит вам, что он ожидал
::
. Потому что переменная class :: $ могла бы удовлетворить ожидаемое выражение переменной $.непредвиденный
{
Фигурные скобки
{
и}
кодовые блоки. А синтаксические ошибки о них обычно указывают на неправильное вложение.Непревзойденные подвыражения в
if
Чаще всего несбалансированно
(
и)
является причиной, если парсер жалуется на то, что открывающееся фигурное выражение{
появляется слишком рано. Простой пример:Подсчитайте свои скобки или используйте IDE, которая поможет с этим. Также не пишите код без пробелов. Читаемость имеет значение.
{и} в контексте выражения
Вы не можете использовать фигурные скобки в выражениях. Если вы перепутаете скобки и фигурные скобки, это не будет соответствовать грамматике языка:
Есть несколько исключений для построения идентификатора, таких как локальная переменная области видимости
${references}
.Переменные переменные или выражения curly var
Это довольно редко. Но вы также можете получать
{
и}
анализировать жалобы для сложных выражений переменных:Хотя
}
в таких ситуациях вероятность неожиданности выше .непредвиденный
}
Получая «неожиданную
}
» ошибку, вы в основном закрывали блок кода слишком рано.Последнее утверждение в блоке кода
Это может произойти для любого неопределенного выражения.
И если в последней строке в блоке функции / кода отсутствует конечная
;
точка с запятой:Здесь синтаксический анализатор не может сказать, если вы, возможно, все еще хотите добавить
+ 25;
к результату функции или что-то еще.Неправильное вложение блоков / Забыли
{
Иногда вы будете видеть эту ошибку синтаксического анализатора, когда блок кода был
}
закрыт слишком рано, или вы забыли{
даже открытие :В приведенном фрагменте
if
не было открывающейся{
фигурной скобки. Таким образом, закрытие}
ниже стало излишним. И поэтому следующее закрытие}
, которое предназначалось для функции, не было связано с исходной{
фигурной скобкой открытия .Такие ошибки еще сложнее найти без правильного отступа кода. Используйте IDE и сопоставление скобок.
непредвиденный
{
, ожидая(
Языковые конструкции, которые требуют заголовка условия / объявления и блока кода, вызовут эту ошибку.
Списки параметров
Например, неправильно объявленные функции без списка параметров не допускаются:
Условия контрольной выписки
И вы также не можете иметь
if
без условия .Что не имеет смысла, очевидно. То же самое для обычных подозреваемых,
for
/foreach
,while
/do
и т. Д.источник
Неожиданный конец $
Когда PHP говорит о «неожиданном
$end
», это означает, что ваш код закончился преждевременно. (Это сообщение немного вводит в заблуждение, если воспринимать его буквально. Оно не относится к переменной с именем $ end, как иногда предполагают новички. Оно относится к «концу файла» EOF,.)В большинстве случаев речь идет об отсутствующей
}
фигурной скобке для закрытия предыдущих блоков кода.Опять же, используйте правильные отступы, чтобы избежать таких проблем.
Используйте IDE с сопоставлением скобок, чтобы узнать, где это
}
не так. В большинстве IDE и текстовых редакторах есть сочетания клавиш:Большинство IDE также выделяют соответствующие скобки, скобки и скобки. Что позволяет довольно легко проверить их соотношение:
Неопределенные выражения
И
Unexpected $end
ошибка синтаксиса / синтаксического анализатора также может произойти для неопределенных выражений или операторов:$var = func(1,
?>
EOFИтак, сначала посмотрите на конец сценария. Трейлинг
;
часто избыточен для последнего оператора в любом скрипте PHP. Но ты должен быть один. Именно потому, что он сужает такие проблемы синтаксиса.Отступы маркеры HEREDOC
Другое распространенное вхождение встречается со строками HEREDOC или NOWDOC . Завершающий маркер игнорируется начальными пробелами, символами табуляции и т. Д .:
Поэтому синтаксический анализатор предполагает, что строка HEREDOC будет продолжаться до конца файла (следовательно, «Неожиданный $ end»). Практически все IDE и редакторы с подсветкой синтаксиса сделают это очевидным или предупредят об этом.
Избежавшие кавычки
Если вы используете
\
в строке, это имеет особое значение. Это называется « Escape Character » и обычно говорит парсеру буквально брать следующий символ.Пример:
echo 'Jim said \'Hello\'';
напечатаетJim said 'hello'
Если вы избегаете закрывающей кавычки строки, закрывающая кавычка будет воспринята буквально, а не так, как предполагалось, то есть как печатная кавычка как часть строки, а не как закрывающая строка. Обычно это будет отображаться как ошибка разбора после открытия следующей строки или в конце скрипта.
Очень распространенная ошибка при указании путей в Windows:
"C:\xampp\htdocs\"
неверно. Вам нужно"C:\\xampp\\htdocs\\"
.Альтернативный синтаксис
Несколько реже можно увидеть эту синтаксическую ошибку при использовании альтернативного синтаксиса для блоков операторов / кода в шаблонах. Использование
if:
иelse:
и отсутствует,endif;
например.Смотрите также:
источник
Неожиданный T_IF
Неожиданный T_ELSEIF
Неожиданный T_ELSE
Неожиданный T_ENDIF
Условные блоки управления
if
,elseif
иelse
следовать за простую структуру. Когда вы сталкиваетесь с синтаксической ошибкой, это, скорее всего, просто недопустимое вложение блоков → с отсутствующими{
фигурными скобками}
- или слишком много.Отсутствует
{
или}
из-за неправильного отступаНесоответствующие скобки кода являются общими для менее хорошо отформатированного кода, такого как:
Если ваш код выглядит так, начните заново! В противном случае это невозможно исправить ни для вас, ни для кого-либо еще. Нет смысла показывать это в Интернете, чтобы попросить о помощи.
Вы сможете исправить это, только если сможете визуально следовать вложенной структуре и соотношению условных операторов if / else и их
{
кодовых блоков}
. Используйте вашу IDE, чтобы увидеть, все ли они спарены.Любой двойник
}
}
не просто закроет ветку, но и структуру предыдущего условия. Поэтому придерживайтесь одного стиля кодирования; не смешивать и сочетать во вложенных деревьях if / else.Помимо последовательности здесь оказывается полезным избегать и длительных условий. Используйте временные переменные или функции, чтобы избежать нечитаемых
if
выражений.IF
нельзя использовать в выраженияхУдивительно частая ошибка новичка - попытка использовать
if
оператор в выражении, например оператор print:Что, конечно, неверно.
Вы можете использовать троичный условный код , но остерегайтесь влияния читабельности.
В противном случае разбейте такие выходные структуры: используйте несколько
if
s иecho
s .А еще лучше, используйте временные переменные и поместите ваши условия перед:
Определение функций или методов для таких случаев также часто имеет смысл.
Блоки управления не возвращают «результаты»
Теперь это не так часто, но некоторые кодировщики даже пытаются обработать так,
if
как если бы он мог вернуть результат :Что структурно идентично использованию
if
внутри конкатенации / выражения строки.Вам придется использовать назначение в блоке кода :
В качестве альтернативы прибегают к
?:
троичному сравнению.Если в Если
Вы не можете вкладывать
if
в условия либо:Что явно избыточно, потому что
and
(илиor
) уже позволяет сравнивать цепочки.Забытые
;
точки с запятойЕще раз: каждый блок управления должен быть оператором. Если предыдущая часть кода не заканчивается точкой с запятой, это гарантированная синтаксическая ошибка:
Кстати, последняя строка в
{…}
блоке кода тоже нуждается в точке с запятой.Точка с запятой слишком рано
Теперь, вероятно, неправильно обвинять конкретный стиль кодирования, поскольку эту ловушку слишком легко упустить из виду:
Что происходит чаще, чем вы можете себе представить.
if ()
выражение,;
оно выполняет оператор void. Сам;
становится пустым{}
!{…}
Блок , таким образом, отделяется отif
, и всегда будет работать.else
больше не имеют отношения к открытойif
конструкции, поэтому это может привести к непредвиденной синтаксической ошибке T_ELSE.Что также объясняет также тонкую вариацию этой синтаксической ошибки:
Где
;
после кода блок{…}
завершает всюif
конструкцию,else
синтаксически разрывая ветвь.Не используя блоки кода
Синтаксически разрешено пропускать фигурные скобки
{
...}
для блоков кода вif
/elseif
/else
ветках. К сожалению, это синтаксический стиль, очень распространенный для неверсированных кодеров. (Под ложным предположением это было быстрее напечатать или прочитать).Однако это, скорее всего, нарушит синтаксис. Рано или поздно дополнительные операторы попадут в ветки if / else:
Но чтобы фактически использовать блоки кода, вы должны написать
{
...}
их как таковые!Остальное / Elseif в неправильном порядке
Конечно , нужно напомнить себе об условном заказе .
Вы можете иметь столько
elseif
s, сколько хотите, ноelse
должны идти последними . Вот только как это.Объявления класса
Как упоминалось выше , вы не можете иметь управляющие операторы в объявлении класса:
В таких случаях вы либо забыли определение функции , либо закрыли ее
}
слишком рано.Неожиданный T_ELSEIF / T_ELSE
При смешивании PHP и HTML закрытие
}
дляif/elseif
должно быть в том же блоке PHP,<?php ?>
что и следующийelseif/else
. Это вызовет ошибку , как закрытие}
ибоif
потребность быть частьюelseif
:Правильная форма
<?php } elseif
:Это более или менее вариант неправильного отступа - предположительно часто основанный на неправильных намерениях кодирования.
Вы не можете помять другие операторы Inbetween
if
иelseif
/else
структурных лексем:Либо может происходить только в
{…}
кодовых блоках, но не между токенами структуры управления.if
иelse
ветвями.Вы также не можете разделить if / else между различными структурами управления:
Там нет синтаксической связи между
if
иelse
. На этомforeach
лексическая область видимости заканчивается}
, поэтому нет смысла продолжатьif
структуру.T_ENDIF
Если к неожиданному T_ENDIF предъявляются претензии, вы используете альтернативный стиль синтаксиса
if:
⋯elseif:
⋯else:
⋯endif;
. О чем стоит подумать дважды.Типичная ошибка путает устрашающе подобное
:
двоеточие для;
точкой с запятой . (В «Точка с запятой слишком рано»)Поскольку отступы в файлах шаблонов отслеживать сложнее, тем более при использовании альтернативного синтаксиса - вероятно, ваш
endif;
не соответствует ни одномуif:
.Используя
} endif;
это в два разаif
-terminator.В то время как «неожиданный конец $» - это обычно цена за забытую
}
фигурную скобку.Назначение против сравнения
Итак, это не синтаксическая ошибка, но стоит упомянуть в этом контексте:
Это не
==
/===
сравнение, но=
назначение . Это довольно тонко, и некоторые пользователи легко могут бесполезно редактировать целые блоки условий. Сначала следите за непреднамеренными заданиями - всякий раз, когда вы испытываете логическую ошибку / неправильное поведение.источник
Неожиданный T_IS_EQUAL
Неожиданный T_IS_GREATER_OR_EQUAL
Неожиданный T_IS_IDENTICAL
Неожиданный T_IS_NOT_EQUAL
Неожиданный T_IS_NOT_IDENTICAL
Неожиданный T_IS_SMALLER_OR_EQUAL
Неожиданный
<
Неожиданный
>
Операторы сравнения , такие как
==
,>=
,===
,!=
,<>
,!==
и ,<=
или<
и в>
основном следует использовать только в выражениях, например,if
выражения. Если синтаксический анализатор жалуется на них, то это часто означает неправильный анализ или несовпадающие(
)
скобки вокруг них.Паренс группировка
В частности, для
if
операторов с множественными сравнениями вы должны позаботиться о правильном подсчете открывающей и закрывающей скобок :Здесь
if
условие здесь уже было прекращено)
Как только ваши сравнения становятся достаточно сложными, это часто помогает разделить их на несколько вложенных
if
конструкций.isset () пюре со сравнением
Обычным новичком является то, что Питфал пытается объединить
isset()
илиempty()
сравнить:Или даже:
Это не имеет смысла для PHP, потому что
isset
иempty
являются языковыми конструкциями, которые принимают только имена переменных. Сравнивать результат тоже не имеет смысла, потому что вывод только / уже логический.Смешение
>=
больше или равно=>
оператором массиваОба оператора выглядят несколько похожими, поэтому они иногда путаются:
Вам нужно только помнить, что этот оператор сравнения называется « больше, чем или равно », чтобы понять его правильно.
Смотрите также: Если структура оператора в PHP
Нечего сравнивать
Вы также не можете объединить два сравнения, если они имеют одно и то же имя переменной:
PHP не может сделать вывод, что вы хотели снова сравнить исходную переменную. Выражения обычно объединяются в соответствии с приоритетом оператора , поэтому к тому времени
<
видны, от исходной переменной останется только логический результат.Смотрите также: неожиданно T_IS_SMALLER_OR_EQUAL
Цепочки сравнения
Вы не можете сравнивать переменную с рядом операторов:
Это должно быть разбито на два сравнения, каждое против
$x
.На самом деле это больше случай выражений в черном списке (из-за эквивалентной операторной ассоциативности). Это синтаксически допустимо в нескольких языках стиля C, но PHP также не будет интерпретировать его как ожидаемую цепочку сравнения.
Неожиданный
>
неожиданный
<
Операторы больше
>
или меньше<
не имеют собственногоT_XXX
имени токенизатора. И хотя они могут быть неуместны, как и все остальные, вы все чаще видите, как парсер жалуется на них из-за неверно цитируемых строк и затертого HTML:Это означает, что строка
"<a href='z"
сравнивается>
с литеральной константой,Hello
а затем выполняется другое<
сравнение. Или, по крайней мере, так видит PHP. Фактическая причина и синтаксическая ошибка была преждевременной строкой"
завершение .Также невозможно вложить стартовые теги PHP:
Смотрите также:
источник
Неожиданный T_IF
Неожиданный T_FOREACH
Неожиданный T_FOR
Неожиданный T_WHILE
Неожиданный T_DO
Неожиданный T_ECHO
Контроль конструкции , такие , как
if
,foreach
,for
,while
,list
,global
,return
,do
,print
,echo
может быть использован только в качестве заявлений. Они обычно проживают на линии самостоятельно.Точка с запятой; где ты?
В большинстве случаев вы пропустили точку с запятой в предыдущей строке, если анализатор жалуется на оператор управления:
Решение: посмотрите на предыдущую строку; добавить точку с запятой.
Объявления класса
Другое место, где это происходит, в объявлениях классов . В разделе класса вы можете перечислить только инициализации свойств и разделы методов. Никакой код не может находиться там.
Такие синтаксические ошибки обычно материализуются для неправильно вложенных
{
и}
. В частности, когда блоки кода функции закрываются слишком рано.Заявления в контексте выражения
Большинство языковых конструкций можно использовать только как операторы . Они не предназначены для размещения внутри других выражений:
Точно так же вы не можете использовать
if
в строках, математических выражениях или где-либо еще:В частности, для встраивания
if
подобных условий в выражение часто требуется использовать?:
троичную оценку .То же самое относится
for
,while
,global
,echo
и в меньшей степениlist
.Принимая во внимание,
print()
что это встроенный язык, который может использоваться в контексте выражения. (Но редко имеет смысл.)Зарезервированные ключевые слова в качестве идентификаторов
Вы также не можете использовать
do
илиif
и другие языковые конструкции для пользовательских функций или имен классов. (Возможно, в PHP 7. Но даже тогда это было бы нецелесообразно.)источник
Неожиданный '?'
Если вы пытаетесь использовать оператор объединения нулей
??
в версии PHP до PHP 7, вы получите эту ошибку.Неожиданный '?', Ожидающий переменную
Аналогичная ошибка может возникать для типов, допускающих значение NULL, например:
Что также указывает на использование устаревшей версии PHP (либо версии CLI,
php -v
либо связанной с веб-серверомphpinfo();
).источник
Неожиданный T_LNUMBER
Маркер
T_LNUMBER
относится к «длинному» / номеру.Неверные имена переменных
В PHP и большинстве других языков программирования переменные не могут начинаться с цифры. Первый символ должен быть буквенным или подчеркиванием.
Довольно часто возникает необходимость использования
preg_replace
-placeholder"$1"
в контексте PHP:Где обратный вызов должен был быть процитирован. (Теперь
/e
флаг регулярного выражения устарел. Но иногда он по-прежнему неправильно используется вpreg_replace_callback
функциях.)То же ограничение идентификатора применяется к свойствам объекта , кстати.
Хотя токенизатор / парсер не допускает литерал в
$1
качестве имени переменной, можно использовать${1}
или${"1"}
. Это синтаксический обход нестандартных идентификаторов. (Лучше всего думать об этом как о поиске в локальной области видимости. Но в целом: для таких случаев предпочитайте простые массивы!)Забавно, но очень не рекомендуется, парсер PHP позволяет использовать Unicode-идентификаторы; такой, что
$➊
будет в силе. (В отличие от буквального1
).Блуждающая запись массива
Неожиданное длинное также может произойти для объявлений массива - при отсутствии
,
запятых:Или аналогично вызовам и объявлениям функций и другим конструкциям:
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
Так что обычно есть один из
;
или,
отсутствует для разделения списков или выражений.Неверно цитируемый HTML
И опять же, неверно цитируемые строки являются частым источником случайных чисел:
Такие случаи должны рассматриваться более или менее как непредвиденные ошибки T_STRING .
Другие идентификаторы
Ни функции, ни классы, ни пространства имен не могут быть названы, начиная с номера:
Почти так же, как и для имен переменных.
источник
Неожиданный '='
Это может быть вызвано наличием недопустимых символов в имени переменной. Имена переменных должны соответствовать следующим правилам:
источник
Неожиданное продолжение (T_CONTINUE)
continue
является утверждением (например, for или if) и должно отображаться отдельно. Его нельзя использовать как часть выражения. Отчасти потому, что continue не возвращает значение, но в выражении каждое подвыражение должно приводить к некоторому значению, поэтому общее выражение приводит к значению. В этом разница между утверждением и выражением.Это означает, что
continue
нельзя использовать в троичной инструкции или в любой инструкции, которая требует возвращаемого значения.Неожиданный перерыв (T_BREAK)
То же самое касается
break;
конечно. Это также не применимо в контексте выражения, но строгое утверждение (на том же уровне, чтоforeach
иif
блок).Неожиданный возврат (T_RETURN)
Теперь это может быть более удивительным
return
, но это также просто утверждение уровня блока . Он возвращает значение (или NULL) в более высокую область видимости / функцию, но не оценивает само выражение. → То есть: нет смысла делатьreturn(return(false);;
источник
Неожиданный "."
Это может произойти, если вы пытаетесь использовать оператор splat (
...
) в неподдерживаемой версии PHP....
впервые стала доступна в PHP 5.6 для захвата переменного количества аргументов функции:В PHP 7.4 вы можете использовать его для выражений Array .
источник
Неожиданный «конец» (T_ENDWHILE)
Синтаксис использует двоеточие - если двоеточие отсутствует, возникнет указанная выше ошибка.
Альтернативой этому синтаксису являются фигурные скобки:
http://php.net/manual/en/control-structures.while.php
источник
Сообщение об ошибке, которое начинается,
Parse error: syntax error, unexpected ':'
может быть вызвано ошибочной записью статической ссылки на классClass::$Variable
какClass:$Variable
.источник