Ошибки разбора/синтаксиса PHP; и как их решить?
Каждый сталкивается с синтаксическими ошибками. Даже опытные программисты допускают опечатки. Для новичков это просто часть процесса обучения. Тем не менее, часто легко интерпретировать сообщения об ошибках, такие как:
PHP Ошибка разбора: синтаксическая ошибка, неожиданный '{' в index.php на строке 20 Неожиданный символ не всегда является истинным виновником. Но номер строки дает примерное представление о том, с чего начать поиск. Всегда смотрите на контекст кода. Синтаксическая ошибка часто скрывается в упомянутых или в предыдущих строках кода. Сравните свой код с примерами синтаксиса из руководства. Хотя не каждый случай совпадает с другим. Тем не менее, есть некоторые общие шаги по решению синтаксических ошибок. В этой ссылке обобщены распространенные "подводные камни":
- Неожиданный T_STRING
- Unexpected T_VARIABLE
Unexpected '$varname' (T_VARIABLE)- Unexpected T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE- Неожиданный $end
- Неожиданная T_FUNCTION...
- Unexpected
{
Unexpected}
Unexpected(
Unexpected)
)- Unexpected
[
Unexpected]
- Unexpected T_IF
Unexpected T_FOREACH
Unexpected T_FOR
Unexpected T_WHILE
Unexpected T_DO
Unexpected T_PRINT
Unexpected T_ECHO- Unexpected T_LNUMBER
- Unexpected ?
- Неожиданное продолжение (T_CONTINUE)
Неожиданное продолжение (T_BREAK)
Неожиданное продолжение (T_RETURN)- Unexpected '='
- Неожиданный T_INLINE_HTML...
- Неожиданный T_PAAMAYIM_NEKUDOTAYIM...
- Неожиданный T_OBJECT_OPERATOR...
- Неожиданный T_DOUBLE_ARROW...
- Unexpected T_SL...
- Unexpected T_BOOLEAN_OR...
Unexpected T_BOOLEAN_AND...- Unexpected T_IS_EQUAL
Неожиданный T_IS_GREATER_OR_EQUAL
Неожиданный T_IS_IDENTICAL
Неожиданный T_IS_NOT_EQUAL
Неожиданный T_IS_NOT_IDENTICAL
Неожиданный T_IS_SMALLER_OR_EQUAL
Неожиданное<
Unexpected>
- Неожиданный T_NS_SEPARATOR...
- Unexpected character in input: '
\
' (ASCII=92) state=1- Unexpected 'public' (T_PUBLIC)
Unexpected 'private' (T_PRIVATE)
Unexpected 'protected' (T_PROTECTED)
Unexpected 'final' (T_FINAL)...- Неожиданный T_STATIC...
- Неожиданный T_CLASS...
- Неожиданный T_DNUMBER
- Неожиданные
,
(запятая)- Unpexected
.
(точка)- Неожиданный
;
(точка с запятой)- Неожиданный
*
(звездочка)- Неожиданный
:
(двоеточие) Близкие по смыслу ссылки:- Что означает эта ошибка в PHP? (ошибки времени выполнения)
- Ошибка разбора: синтаксическая ошибка, неожиданный T_XXX
- Ошибка разбора: синтаксическая ошибка, неожиданный T_ENCAPSED_AND_WHITESPACE
- Ошибка разбора: синтаксическая ошибка, неожиданный T_VARIABLE
- Что означает этот символ в PHP? (языковые лексемы)
- Эти
умные
кавычки ничего не значат для PHP И:
- Руководство по PHP на php.net и его различные языковые лексемы
- Или Википедия введение в синтаксис PHP.
- И, наконец, наша php tag-wiki, конечно. Хотя Stack Overflow также приветствует начинающих кодеров, в основном он нацелен на профессиональные вопросы программирования.
- Ответы на ошибки кодирования и узкие опечатки считаются в основном не по теме.
- Поэтому, пожалуйста, потратьте время на выполнение основных шагов, прежде чем публиковать запросы на исправление синтаксиса.
Если вам все еще нужно, пожалуйста, покажите свою собственную инициативу в решении проблемы, попытки исправления и ход ваших мыслей о том, что выглядит или может быть неправильным. Если ваш браузер выдает сообщения об ошибках типа "SyntaxError: illegal character", то это 'не [tag:php]-связано, а [tag:javascript]-синтаксическая ошибка.
Синтаксические ошибки, возникшие в коде поставщика: Наконец, учтите, что если синтаксическая ошибка возникла не при редактировании вашей кодовой базы, а после установки или обновления пакета внешнего поставщика, это может быть связано с несовместимостью версий PHP, поэтому сверьте требования поставщика с настройками вашей платформы.
Какие бывают синтаксические ошибки?
PHP относится к C-стилю и императивному языкам программирования. Он имеет жесткие правила грамматики, от которых он не может оправиться, когда сталкивается с неправильным расположением символов или идентификаторов. Он не может угадать ваши намерения по кодированию.
Самые важные советы
Есть несколько основных мер предосторожности, которые вы всегда можете предпринять:
Используйте правильное отступы в коде, или примите какой-либо возвышенный стиль кодирования. Читабельность предотвращает неровности.
Используйте IDE или редактор для PHP с подсветкой синтаксиса. Это также поможет с балансировкой скобок/разделительных скобок. .
Прочитайте справочник по языку и примеры в руководстве. Дважды, чтобы стать в некоторой степени знатоком.
Как интерпретировать ошибки синтаксического анализатора
Типичное сообщение об ошибке синтаксиса выглядит следующим образом:
Откройте упомянутый исходный файл. Посмотрите на упомянутую строку кода.
Более регулярно вам нужно смотреть и на предшествующие строки.
;
точки с запятой отсутствуют в конце предыдущей строки/заявления. (По крайней мере, со стилистической точки зрения. ){
блоки кода`` неправильно закрыты или вложены, вам, возможно, придется исследовать еще глубже в исходный код. Используйте правильное отступы кода, чтобы упростить эту задачу.Посмотрите на окраску синтаксиса!
+-*/.
также должны быть окрашены в разные цвета. Иначе они могут оказаться в неправильном контексте."
или'
маркер строки.++
,--
или круглые скобки. Две строки/идентификатора, непосредственно следующие друг за другом, некорректны в большинстве контекстов.Пробел - ваш друг. Следуйте любому стилю кодирования.
Временно разбивайте длинные строки.
if
на отдельные или вложенные условияif
.Разбивка длинных блоков кода действительно помогает найти источник синтаксических ошибок.
Выделите комментарием ошибочный код.
Как новичок, избегайте некоторых непонятных синтаксических конструкций.
? :
может уплотнить код и действительно полезен. Но не во всех случаях он способствует читабельности. Предпочитайте простые операторыif
, пока не разбираетесь.if:
/elseif:
/endif;
) является обычным для шаблонов, но, возможно, менее удобен для чтения, чем обычные блоки{
код}
.Наиболее распространенными ошибками новичков являются:
;
для завершения утверждений/строк."
или'
и неэкранированные кавычки внутри..
.(
скобки)
. Посчитайте их в сообщаемой строке. Одинаковое ли их количество?Не забывайте, что решение одной синтаксической проблемы может привести к появлению следующей.
Восстановите резервную копию ранее работавшего кода, если вы не можете его исправить.
diff
сломанной и последней рабочей версии. Это может прояснить, в чем проблема с синтаксисом.Невидимые блуждающие символы Unicode: В некоторых случаях вам необходимо использовать hexeditor или другой редактор/просмотрщик вашего исходного текста. Некоторые проблемы невозможно обнаружить, просто взглянув на ваш код.
grep --color -P -n "\[\x80-\xFF\]" file.php
в качестве первой меры для поиска не-ASCII символов.Следите за тем, какие типы перевода строки сохраняются в файлах.
////
или#
комментариев. Многострочные/*...*/
комментарии редко беспокоят парсер, когда игнорируются переносы строк.Если ваша синтаксическая ошибка не передается по сети: Бывает, что синтаксическая ошибка у вас на машине. Но при размещении того же самого файла в Интернете она больше не проявляется. Это может означать только одно из двух:
Проверьте версию PHP. Не все синтаксические конструкции доступны на каждом сервере.
php -v
для интерпретатора командной строки<?php php phpinfo();
для интерпретатора, вызываемого через веб-сервер.Это 'не обязательно одно и то же. В частности, при работе с фреймворками они должны совпадать.
Не используйте PHP'зарезервированные ключевые слова в качестве идентификаторов для функций/методов, классов или констант.
Метод проб и ошибок - это ваше последнее средство. Если ничего не получается, вы всегда можете погуглить сообщение об ошибке. Синтаксические символы не так легко искать (хотя сам Stack Overflow индексируется SymbolHound). Поэтому может потребоваться просмотреть еще несколько страниц, прежде чем вы найдете что-то подходящее. Дополнительные руководства:
Основы отладки PHP Дэвида Скляра
Исправление ошибок PHP Джейсон МакКрири
Ошибки PHP - 10 распространенных ошибок Марио Луриг
Распространенные ошибки PHP и их решения
Как устранить неполадки и починить ваш сайт WordPress
Руководство по сообщениям об ошибках PHP для дизайнеров - Smashing Magazine
Белый экран смерти
Если ваш сайт просто пуст, то, как правило, причиной является синтаксическая ошибка. Включите их отображение с помощью:
error_reporting = E_ALL
.display_errors = 1
. В вашемphp.ini
обычно, или через.htaccess
для mod_php, или даже.user.ini
при настройке FastCGI. Включать его в сломанном скрипте слишком поздно, потому что PHP не может интерпретировать/запустить даже первую строку. Быстрым обходным решением является создание скрипта-обертки, скажемtest.php
:Затем вызовите сбойный код, обратившись к этому скрипту-обертке. Также полезно включить PHP's
error_log
и посмотреть в ваш веб-сервер'serror.log
, когда скрипт падает с ответами HTTP 500.Я думаю, что эта тема полностью обсуждена / слишком сложна. Использование IDE - это способ полностью избежать синтаксических ошибок. Я бы даже сказал, что работать без IDE непрофессионально. Почему? Потому что современные IDE проверяют ваш синтаксис после каждого символа, который вы вводите. Когда ваш код и вся ваша строка становятся красными, и большое предупреждение показывает вам точный тип и точное положение синтаксической ошибки, тогда нет абсолютно необходимости искать другое решение.
Использование IDE для проверки синтаксиса означает:
Вы (эффективно) никогда больше не столкнетесь с синтаксическими ошибками просто потому, что видите их правильно при вводе. Шутки в сторону.
Неожиданно
[
В наши дни неожиданная скобка массива
[
обычно встречается в устаревших версиях PHP. Синтаксис короткого массива доступен начиная с PHP > = 5.4 . Старые установки поддерживают толькоarray ()
.Отключение результатов функции массива также недоступно для более старых версий PHP:
[Ссылка - что означает эта ошибка в PHP? - «Ошибка синтаксиса, неожиданный« \ `» показывает наиболее распространенные и практические обходные пути.
Тем не менее, вам всегда лучше просто обновить установку PHP. Для общих планов веб-хостинга, первое исследование, если, например,.
SetHandler php56-fcgi
можно использовать для включения более нового времени выполнения.Смотрите также:
Кстати, есть также препроцессоры и информаторы PHP 5.4, если вы действительно цепляетесь за старые + более медленные версии PHP.
Другие причины Неожиданные синтаксические ошибки
[
Если это не несоответствие версии PHP, то часто это простая ошибка опечатки или синтаксиса новичка:
Вы не можете использовать объявления / выражения свойств массива в классах, даже в PHP & nbsp; 7.
Смешение
[
с открытием фигурных скобок{
или скобок(
является общим упущением.Или даже:
Или пытаясь разыменовать константы (до PHP 5.6) как массивы:
По крайней мере, PHP интерпретирует это «const» как постоянное имя.
Если вы хотели получить доступ к переменной массива (что здесь является типичной причиной), добавьте ведущую версию
$
sigil - чтобы она стала$ varname
.Вы пытаетесь использовать ключевое слово
global
для члена ассоциативного массива. Это недопустимый синтаксис:& Лт; br / >
Неожиданный
]
закрывающий квадратный кронштейнЭто несколько реже, но есть и синтаксические аварии с завершающим массивом
]
.Опять не соответствует скобкам
)
или}
светлые скобки распространены:Или пытаясь закончить массив, где его нет:
Что часто встречается в декларациях массивов multi-line и nested .
Если это так, используйте свою IDE для сопоставления скобок, чтобы найти преждевременное закрытие массива
]
. По крайней мере, используйте больше интервалов и новых линий, чтобы сузить его.Неожиданная переменная T_VARIABLE
Ошибка "unexpected
T_VARIABLE
" означает, что имеется буквальное имя$variable
, которое не вписывается в структуру текущего выражения/высказывания.Отсутствие точки с запятой
Чаще всего указывает на пропущенную точку с запятой в предыдущей строке. Назначение переменных после утверждения является хорошим индикатором того, где искать:
Конкатенация строк
Частым казусом являются конкатенации строк с забытым оператором
.
:Кстати, вы должны предпочесть интерполяцию строк (базовые переменные в двойных кавычках), если это помогает читабельности. Это позволяет избежать подобных проблем с синтаксисом.
Отсутствие операторов выражения
Конечно, такая же проблема может возникнуть и в других выражениях, например, в арифметических операциях:
PHP не может угадать, должна ли переменная быть сложена, вычтена или сравнена и т.д.
Списки
То же самое для синтаксических списков, как в популяциях массивов, где парсер также указывает ожидаемую запятую
,
, например:Или списки параметров функций:
Эквивалентно вы можете увидеть это в операторах
list
илиglobal
, или при отсутствии точки с запятой в циклеfor
.Объявления классов
Эта ошибка парсера также встречается в объявлениях классов. Вы можете присваивать только статические константы, но не выражения. Поэтому синтаксический анализатор жалуется на переменные как на присвоенные данные:
Несопоставленные
}
, закрывающие фигурные скобки, могут, в частности, привести к этому. Если метод завершается слишком рано (используйте правильный отступ!), то блуждающая переменная обычно ошибочно помещается в тело объявления класса.Переменные после идентификаторов
Также никогда нельзя располагать переменную после идентификатора напрямую:
Кстати, это распространенный пример, когда намерение было использовать переменные переменные возможно. В этом случае поиск свойства переменной с помощью
$this->{"myFunc$VAR"}();
, например.Отсутствие паренсов после языковых конструкций
Поспешный набор текста может привести к забытой открывающей скобке для операторов
if
,for
иforeach
:Решение: добавьте недостающее открывающее
(
между оператором и переменной.Else не ожидает условий
Решение: Удалите условия из
else
или используйтеelseif
.Нужны скобки для закрытия
Решение: Добавьте скобки вокруг
$var
.Невидимые пробелы
Как упоминалось в справочном ответе о "Невидимых пробельных символах Unicode" (таких как неразрывный пробел), вы также можете увидеть эту ошибку для ничего не подозревающего кода, например:
Это довольно распространено в начале файлов и для скопированного и вставленного кода. Проверьте с помощью hexeditor, если визуально не кажется, что в вашем коде есть проблемы с синтаксисом.
См. также
& Лт;!--ToDo: включить https://stackoverflow.com/a/13935532/345031, который лучше охватывает первый общий случай.-- >
Неожиданный T_CONSTANT_ENCAPSED_STRING
Неожиданный T_ENCAPSED_AND_WHITESPACE
Громоздкие имена
T_CONSTANT_ENCAPSED_STRING
иT_ENCAPSED_AND_WHITESPACE
относятся к цитируемой" строке"
литералы .Они используются в разных контекстах, но проблема синтаксиса довольно похожа. T_ENCAPSED ... предупреждения встречаются в контексте строк с двумя кавычками, в то время как T_CONSTANT ... строки часто сбиваются с пути в простых выражениях или утверждениях PHP.
И это чаще всего встречается при неправильной интерполяции переменных PHP:
Цитирование ключей массивов является обязательным в контексте PHP. Но в двойных кавычках (или HEREDOCs) это ошибка. Анализатор жалуется на содержащуюся в нем одну цитируемую
'string'
, потому что он обычно ожидает там буквальный идентификатор / ключ.Точнее, допустимо использовать стиль PHP2 простой синтаксис в двойных кавычках для ссылок на массивы:
Однако вложенные массивы или более глубокие ссылки на объекты требуют синтаксиса [сложного кудрявого строкового выражения](http://www.php.net/language.types.string#language.types.string.parsing#complex+curly + syntax):
Если вы не уверены, это обычно безопаснее в использовании. Это часто даже считается более читабельным. И лучшие IDE на самом деле используют для этого отличную синтаксическую раскраску.
Если строка следует выражению, но не имеет конкатенации или другого оператора, то вы увидите, что PHP жалуется на строковую строку:
Хотя это очевидно для вас и меня, PHP просто не может догадаться , что строка должна была быть добавлена там.
Та же синтаксическая ошибка возникает, когда сводящие разделители строк. Строка, начатая одной цитатой
'
или double"
, также заканчивается той же.Этот пример начался с двойных кавычек. Но двойные кавычки были также предназначены для атрибутов HTML. Предполагаемый оператор конкатенации внутри, однако, стал интерпретироваться как часть второй строки в одинарных кавычках.
Это хороший пример, когда вы не должны вырывать двойные кавычки. Вместо этого просто используйте propert
\ "
escapts для HTML атрибуты и # 180; кавычкиХотя это также может привести к путанице в синтаксисе, все лучшие IDE / редакторы снова помогают, по-разному окрашивая экранированные кавычки.
Эквивалентно забытые открывающие кавычки
"
/ `` рецепт для ошибок синтаксического анализатора:Здесь
', '
станет строковым литералом после голого слова, когда очевидно, чтоlogin
должен был быть строковым параметром.Если вы пропустите запятую
,
в блоке создания массива, анализатор увидит две последовательные строки:Обратите внимание, что последняя строка всегда может содержать дополнительную запятую, но пропустить одну промежуточную непростительно. Что трудно обнаружить без подсветки синтаксиса.
То же самое для вызовов функций:
Распространенным вариантом являются просто забытые строковые терминаторы:
Здесь PHP жалуется на двух струнных литералов, непосредственно следующих друг за другом. Но настоящая причина, конечно, в незакрытой предыдущей строке.
Смотрите также
Неожиданный T_STRING
T_STRING
- это немного неправильный термин. Оно не относится к заключенной в кавычки"строке"
. Это означает, что встретился необработанный идентификатор. Это могут бытьпустые
слова, остаткиCONSTANT
или имен функций, забытые строки без кавычек или любой простой текст.Неправильно процитированные строки
Эта синтаксическая ошибка чаще всего встречается для неправильно закавыченных строковых значений. Любая неэкранированная кавычка `"` или `'` образует недопустимое выражение: ⇓ ⇓ echo "нажмите здесь"; Подсветка синтаксиса сделает такие ошибки очевидными. Важно помнить, что для экранирования `\"двойных кавычек'' или `\'одинарных кавычек - в зависимости от того, что было использовано в качестве [корпуса строки][1] - следует использовать обратные слэши. - Для удобства вы должны предпочесть внешние одинарные кавычки при выводе обычного HTML с двойными кавычками внутри. - Используйте строки с двойными кавычками, если вы хотите интерполировать переменные, но тогда следите за экранированием буквальных `"двойных кавычек''. - Для более длинного вывода предпочтите несколько строк `echo`/ `print` вместо экранирования входов и выходов. Еще лучше рассмотреть раздел [HEREDOC][2]. См. также *https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php*.Незакрытые строки
Если вы [пропускаете закрывающую `"строку''][3], то синтаксическая ошибка обычно проявляется позже. Незавершенная строка часто будет занимать немного кода до следующего предполагаемого значения строки: ⇓ echo "Некоторый текст", $a_variable, "и некоторая убегающая строка ; success("finished"); ⇯ Это не только буквальные `T_STRING`, которые парсер может протестовать. Другой частой вариацией является [`Unexpected '>'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error) для нецитированного литерала HTML.Непрограммируемые строковые кавычки
Если вы *копируете и вставляете* код с блога или веб-сайта, то иногда в итоге получаете недопустимый код. [Типографские кавычки - это не то, что ожидает PHP][4]: $text = 'Something something something...' + "these ain't quotes"; Типографские/умные кавычки - это символы Юникода. PHP воспринимает их как часть примыкающего буквенно-цифрового текста. Например, `"these" интерпретируется как идентификатор константы. Но любой следующий за ним текстовый литерал воспринимается парсером как пустое слово/T_STRING.Отсутствие точки с запятой; снова
Если в предыдущих строках есть выражение без точки с запятой, то любое следующее утверждение или языковая конструкция воспринимается как необработанный идентификатор: ⇓ func1() function2(); PHP просто не может понять, хотели ли вы запустить две функции друг за другом, или вы хотели перемножить их результаты, сложить их, сравнить их, или запустить только одну `|||` или другую.Короткие открытые теги и
Это довольно редкое явление. Но если включены short_open_tags, то вы не можете'начинать свои PHP-скрипты [с XML-декларации][5]: ⇓ <?xml version="1.0"?> PHP увидит `<?` и присвоит его себе. Он не поймет, для чего предназначался этот "блуждающий" `xml`. Она будет интерпретирована как константа. Но `version` будет восприниматься как еще один литерал/константа. А поскольку парсер не может понять смысл двух последующих литералов/значений без оператора выражения между ними, это будет ошибкой парсера.<?xml
заголовки в PHP скриптахНевидимые символы Unicode
Самой отвратительной причиной синтаксических ошибок являются символы Unicode, такие как [неразрывный пробел][6]. PHP допускает использование символов Unicode в качестве имен идентификаторов. Если вы получаете жалобу парсера T_STRING на совершенно не подозрительный код, например: <?php выведите 123; вам нужно достать другой текстовый редактор. Или даже hexeditor. То, что здесь выглядит как обычные пробелы и новые строки, может содержать невидимые константы. Java IDE иногда не обращают внимания на UTF-8 BOM, искаженный внутри, пробелы нулевой ширины, разделители абзацев и т.д. Попробуйте перередактировать все, удалить пробельные символы и добавить нормальные пробелы обратно. Вы можете сузить круг поиска, добавив лишние разделители `;` в начале каждой строки: <?php ;print 123; Лишняя точка с запятой `;` преобразует предшествующий невидимый символ в ссылку на неопределенную константу (выражение как утверждение). Что в свою очередь заставит PHP выдать полезное уведомление.Отсутствие знака `$` перед именами переменных
[Переменные в PHP][7] представлены знаком доллара, за которым следует имя переменной. Знак доллара (`$`) - это [знак отличия][8], который отмечает идентификатор как имя переменной. Без этого знака идентификатор может быть [ключевым словом языка][9] или [константой][10]. Это распространенная ошибка, когда код PHP был ["переведен" из кода, написанного на другом языке][11] (C, Java, JavaScript и т.д.). В таких случаях объявление типа переменной (если исходный код был написан на языке, использующем типизированные переменные) также может проскочить и выдать эту ошибку.Сбежавшие кавычки
Если вы используете `\` в строке, это имеет особое значение. Это называется "[Escape Character][12]" и обычно говорит синтаксическому анализатору, что следующий символ следует воспринимать буквально. Пример: `echo 'Jim said \'Hello\'';` выведет `Jim said 'hello'`. Если вы экранируете закрывающую кавычку строки, то закрывающая кавычка будет воспринята буквально, а не по назначению, т.е. как печатная кавычка, как часть строки, а не как закрытие строки. Это будет отображаться как ошибка разбора, обычно после открытия следующей строки или в конце скрипта. Очень распространенная ошибка при указании путей в Windows: `"C:\xampp\htdocs\"` неверно. Вам нужно `"C:\\\xampp\\htdocs\\"`.Неожиданно
(
Открывающиеся скобки обычно следуют за языковыми конструкциями, такими как
if
/foreach
/for
/array
/list
, или запускают арифметическое выражение. Они синтаксически неверны после"strings"
, предыдущего()
, одинокого$
и в некоторых типичных контекстах декларации.Более редким явлением для этой ошибки является попытка использовать выражения в качестве параметров функции по умолчанию. Это не поддерживается даже в PHP7:
Параметры в объявлении функции могут быть только буквальными значениями или постоянными выражениями. В отличие от функций вызова, где вы можете свободно использовать
what (1 + something () * 2)
и т. Д.То же самое для заявлений участников класса, где допускаются только буквальные / постоянные значения, а не выражения:
Поместите такие вещи в конструктор. Смотрите также Почему атрибуты PHP не позволяют функции?
Еще раз обратите внимание, что PHP 7 допускает только постоянные выражения
var $ xy = 1 + 2 +3;
.Использование JavaScript или синтаксис jQuery не будет работать в PHP по понятным причинам:
Когда это происходит, это обычно указывает на незавершенную предыдущую строку; и буквальные разделы
< script >
, просачивающиеся в контекст кода PHP.И
isset ()
, иempty ()
являются встроенными языками, а не функциями. Им необходимо получить доступ к переменной напрямую. Если вы случайно добавите пару скобок слишком много, вы создадите выражение однако:То же самое относится к любой языковой конструкции, которая требует неявного доступа к имени переменной. Эти встроенные элементы являются частью языковой грамматики, поэтому не допускают дополнительных декоративных скобок.
Функции пользовательского уровня, для которых требуется ссылка на переменную, но вместо этого получают результат выражения passed-lead к ошибкам времени выполнения.
& Лт; br >
Неожиданно
)
Вы не можете отклониться запястья последней в вызове функции. PHP ожидает ценность и, таким образом, жалуется на скобки раннего закрытия
)
.Конечная запятая разрешена только в конструкциях
array ()
илиlist ()
.Если вы забыли что-то в арифметическом выражении, то анализатор сдается. Потому что как это должно интерпретировать это:
И если вы забыли даже закрытие
)
, то вместо этого вы получите жалобу на неожиданную точку с запятой.Для забытых префиксов
$
в контрольных операторах вы увидите:PHP здесь иногда говорит вам, что ожидал
::
вместо. Потому что переменная класса :: $ могла бы удовлетворить ожидаемое переменное выражение $..& Лт; br >
Неожиданно
{
Кудрявые скобки
{
и}
включают блоки кода. И синтаксические ошибки о них обычно указывают на некоторое вложение incorrec.if < / code > & Лт; / h3 >
Чаще всего несбалансированный
(
и)
являются причиной, если анализатор жалуется на открытие кудрявого{
выходит слишком рано. Простой пример:Подсчитайте свои parens или используйте IDE, которая помогает с этим. Также не пишите код без пробелов. Читаемость имеет значение.
Вы не можете использовать фигурные скобки в выражениях. Если вы путаете скобки и кудрявые, это не будет соответствовать грамматике языка:
Есть несколько исключений для построения идентификатора, таких как локальная переменная области действия
$ {references}
.Это довольно редко. Но вы также можете получить жалобы синтаксического анализатора
{
и `} для сложных переменных:Хотя вероятность неожиданного
}
в таких условиях выше.& Лт; br >
Неожиданно
}
При получении «неожиданной ошибки» вы в основном закрыли блок кода слишком рано.
Это может случиться для любого нескончаемого выражения.
И если в последней строке в блоке функции / кода отсутствует завершающая точка
;
semicolon:Здесь анализатор не может сказать, возможно ли вы все еще хотели добавить
+ 25;
к результату функции или чему-то еще.Иногда вы видите эту ошибку синтаксического анализатора, когда блок кода был
}
закрыт слишком рано, или вы забыли открытие{
enre:В приведенном выше фрагменте
if
не было отверстия{
фигурная скобка. Таким образом, закрывающее}
одно ниже стало избыточным. И поэтому следующее закрытие}
, которое предназначалось для функции, не было связано с исходным открытием{
фигурной скобой.Таких ошибок еще сложнее найти без правильного отступа кода. Используйте IDE и сопоставление скобок.
& Лт; br >
Неожиданно
{
, ожидая(
Языковые конструкции, для которых требуется заголовок условия / декларации и блок кода, вызовут эту ошибку.
Например, необъявленные функции без списка параметров не допускаются:
И вы также не можете иметь
if
без условий.Что не имеет смысла, очевидно. То же самое для обычных подозреваемых,
для
/foreach
,while
/do
и т. Д.Неожиданный T_IF
Неожиданный T_ELSEIF
Неожиданный T_ELSE
Неожиданный T_ENDIF
& Лт; / h2 >
Условные блоки управления
if
,elseif
иelse
следуют простой структуре. Когда вы сталкиваетесь с синтаксической ошибкой, скорее всего, это просто недопустимый блок вложения → с отсутствующим{
кудрявыми скобами}
- или слишком большим.Несоответствующие брекеты кода являются общими для менее хорошо отформатированного кода, такого как:
Если ваш код выглядит так, начните заново! В противном случае это нефиксируется ни для вас, ни для кого-либо еще. Нет смысла демонстрировать это в Интернете, чтобы обратиться за помощью.
Вы сможете это исправить, только если сможете визуально следовать вложенной структуре и соотношению if / else условий и их
{
code blocks}
. Используйте свою IDE, чтобы увидеть, все ли они в паре.Любой двойной
}
}` закроет не только ветку, но и предыдущую структуру условий. Поэтому придерживайтесь одного стиля кодирования; не смешивайте и не подбирайте вложенные деревья if / else.Помимо последовательности здесь оказывается полезным избегать длительных условий тоже. Используйте временные переменные или функции, чтобы избежать нечитаемых
if
-выражений.Удивительно частая ошибка новичка - попытка использовать в выражении утверждение «если», например, печатное заявление:
Что, конечно, недопустимо.
Вы можете использовать последовательное условие, но остерегайтесь воздействия на читаемость.
В противном случае разбить такие выходные конструкции вверх: используйте несколько
if
s иecho
s.А еще лучше, используйте временные переменные и поместите ваши условия до:
Определение функций или методов для таких случаев также часто имеет смысл.
< h3 > Блоки управления не возвращают «результаты» < / h3 >Теперь это встречается реже, но несколько кодеров даже пытаются обработать
if
так, как если бы он мог вернуть результат :Что структурно идентично использованию
if
в конкатенации / выражении строки.Но структуры управления (if / foreach / while) не имеют "результата" .
Буквенная строка «true» также будет просто пустым утверждением.
Вам придется использовать назначение в блоке кода :
В качестве альтернативы прибегайте к
< h3 > Если в If < / h3 >?:
троичное сравнение.Вы не можете прикрепить
if
в пределах условия:Что явно избыточно, потому что
и
(илиили
) уже позволяет сравнивать цепочки.Еще раз: каждый блок управления должен быть оператором. Если предыдущая часть кода не заканчивается точкой с запятой, то это гарантированная синтаксическая ошибка:
Кстати, последняя строка в блоке кода
{...}
имеет точку с запятой.Теперь, вероятно, неправильно обвинять определенный стиль кодирования, поскольку эту ошибку слишком легко игнорировать:
Что происходит чаще, чем вы можете себе представить.
Когда вы завершите выражение
if ()
на;
, оно выполнит пустое утверждение.;
становится пустым{{{{{{{}}}}}}}
своего собственного!Блок
{...}
, таким образом, отсоединяется отif
и всегда будет работать.Таким образом,
else
больше не имел отношения к открытойif
конструкции,вот почему это приведет к непредвиденной ошибке синтаксиса T_ELSE.
Что также объясняет тонкое изменение этой синтаксической ошибки:
Где
;
после блока кода{...}
окончивает весьif
конструкция, синтаксически разрывая ветку
else
.Синтаксически разрешено опускать фигурные скобки
{
...}
для блоков кода в ветвяхif
/elseif
/else
. К сожалению, синтаксический стиль очень распространен среди нерешенных кодеров. (При ложном предположении это было быстрее печатать или читать).Однако это, скорее всего, приведет к изменению синтаксиса. Рано или поздно дополнительные заявления попадут в филиалы if / else:
Но чтобы на самом деле использовать блоки кода, у вас есть ***, чтобы написать
{
...}
их как таковые!понять это как исключительное исключение из правила.
Одна вещь, чтобы напомнить себе, конечно, условный порядок.
Вы можете иметь столько
elseif
, сколько хотите, ноelse
должен идти последним. Вот так.Как упомянуто выше, вы не можете иметь контрольные операторы в декларации класса:
Вы либо забыли функцию, либо закрыли одно
}
слишком рано в таких случаях.При смешивании PHP и HTML замыкание
}
дляif / elseif
должно находиться в одном блоке PHP<?php ?>
как следующийelseif / else
. Это приведет к ошибке, так как закрытие}
дляif
должно быть частьюelseif
:Правильная форма
<?php} elseif
:Это более или менее вариация неправильного отступа - предположительно, часто основанная на неправильных намерениях кодирования.
Либо может происходить только в кодовых блоках
{...}
, а не между токенами структуры управления.Это все равно не имеет смысла. Не то чтобы было какое-то «неопределенное» состояние, когда PHP прыгает между ветвями
if
иelse
.Вам придется принять решение, где печатные заявления принадлежат / или если их нужно повторить в обеих ветках.
Вы также не можете разделить if / else между различными структурами управления:
Между
if
иelse
нет синтаксического отношения. Лексическая областьforeach
заканчивается на}
, поэтому нет смысла продолжать структуруif
.Если на неожиданный T_ENDIF жалуются, вы используете альтернативный стиль синтаксиса
if:
⁇elseif:
⁇else:
⁇endif;
. О чем вы должны подумать дважды.Обычный ловушка сбивает с толку жутко [аналогично
:
colon для;
semicolon](https://stackoverflow.com/questions/19250411/parse-error-syntax-error-unexpected-t-endif-in- home-content-error-php). (Покрыто в «Семмиколоне слишком рано»)Поскольку в файлах шаблонов труднее отслеживать отступ, тем больше при использовании альтернативного синтаксиса - вполне вероятно, что ваш
endif;
не соответствуетif:
.Использование
} endif;
if
-терминатор.В то время как «неожиданный конец доллара» обычно является ценой забытого закрытия
}
curly brace.Таким образом, это не синтаксическая ошибка, но стоит упомянуть в этом контексте:
Это не сравнение
==
/===
, а назначение=
. Это довольно тонко и легко приведет некоторых пользователей к беспомощному редактированию целых блоков условий. Сначала следите за непреднамеренными заданиями - когда бы вы ни столкнулись с логической ошибкой / неправильным поведением.Неожиданный конец
Когда PHP говорит о «неожиданном« $ end »», это означает, что ваш код закончился преждевременно. (Сообщение немного вводит в заблуждение, если принимать буквально. Речь идет не о переменной с именем «$ end», как иногда предполагают новички. Это относится к «концу файла», EOF < / kbd >.)
Это почти всегда о отсутствующей
}
светлой скобке, чтобы закрыть предыдущие блоки кода.Опять же, используйте надлежащий отступ, чтобы избежать таких проблем.
Используйте IDE с соответствием скобок, чтобы узнать, где
}
amiss. В большинстве IDE и текстовых редакторов есть сочетания клавишБольшинство IDE также подчеркивают совпадающие скобки, скобки и скобки. Что позволяет довольно легко проверить их корреляцию:
[Соответствие скобок в IDE][1]!
Непрекращенные выражения
И `Неожиданная синтаксис / ошибка parser $ end также может возникнуть для нетермированных выражений или операторов:
$ var = func (1,
?>
EOF < / kbd >Итак, сначала посмотрите на конец сценариев. Конечный
;
часто избыточен для последнего оператора в любом скрипте PHP. Но у тебя должен быть один. Именно потому, что это сужает такие синтаксические проблемы.Отступы HEREDOC маркеры
Другое распространенное явление появляется со строками [HEREDOC или NOWDOC][2]. Конечный маркер игнорируется с ведущими пробелами, вкладками и т. Д.:
Неожиданный T_FOREACH
Неожиданный T_FOR
Неожиданный T_WHILE
Неожиданный T_DO
Неожиданный T_ECHO & Лт; / h2 >
Конструкции управления, такие как
if
,foreach
,for
,while
,list
,global
,return
,do
,print
,echo
могут использоваться только в качестве операторов. Они обычно проживают на линии сами по себе.Довольно универсально вы пропустили точку с запятой в предыдущей строке, если анализатор жалуется на контрольное утверждение:
Решение: посмотрите в предыдущую строку; добавить точку с запятой.
Другое место, где это происходит, - в декларациях классов. В разделе класса вы можете только перечислять инициализации свойств и разделы методов. Там не может находиться ни один код.
Такие синтаксические ошибки обычно материализуются для неправильно вложенных
{
и}
. В частности, когда блоки кода функции закрылись слишком рано.Большинство языковых конструкций могут использоваться только в качестве операторов. Они не предназначены для размещения внутри других выражений:
Точно так же вы не можете использовать
if
в строках, математических выражениях или в другом месте:Для включения
if
-подобных условий в выражение конкретно, вы часто хотите использовать?:
Тернарная оценка.& Лт; / sup >То же самое относится к
for
,while
,global
,echo
и менее расширенномуlist
.Принимая во внимание, что
print ()
является встроенным языком, который может использоваться в контексте выражения. (Но редко имеет смысл.)Вы также не можете использовать
do
илиif
и другие языковые конструкции для пользовательских функций или имен классов. (Возможно, в PHP7. Но даже тогда это не было бы целесообразно.)Неожиданный T_IS_GREATER_OR_EQUAL
Неожиданный T_IS_IDENTICAL
Неожиданный T_IS_NOT_EQUAL
Неожиданный T_IS_NOT_IDENTICAL
Неожиданный T_IS_SMALLER_OR_EQUAL
Неожиданный < код > & lt; < / код >
Неожиданный < код > > < / код > & Лт; / h2 >
Операторы сравнения, такие как
==
,> =
,===
,!=
,< >
,!==
и< =
или<
и>
в основном следует использовать только в выражениях, таких как выраженияif
. Если анализатор жалуется на них, то это часто означает неправильную разбивку или несоответствующие(``)
parens вокруг них.В частности, для утверждений
if
с несколькими сравнениями вы должны позаботиться о правильном подсчете открывающих и закрывающих скобок:Здесь условие
if
здесь уже было прекращено)
Как только ваши сравнения становятся достаточно сложными, это часто помогает разделить их на несколько вложенных конструкций
if
.Обычный новичок - питфал пытается объединить
isset ()
илиempty ()
со сравнениями: ,Или даже:
Это не имеет смысла для PHP, потому что
isset
иempty
- это языковые конструкции, которые принимают только имена переменных. Также не имеет смысла сравнивать результат, потому что выходные данные являются только / уже логическими.> = < / code > больше или равно
= > < / code > оператор массива < / h3 >
Оба оператора выглядят несколько похожими, поэтому они иногда путаются:
Вам нужно только помнить, что этот оператор сравнения называется « больше или равно », чтобы понять это правильно.
Смотрите также: https://stackoverflow.com/questions/2551718/if-statement-structure-in-php
Вы также не можете объединить два сравнения, если они относятся к одному и тому же имени переменной:
PHP не может сделать вывод, что вы хотели снова сравнить начальную переменную. Выражения обычно спариваются в соответствии с приоритет оператора, поэтому к тому времени, когда ` Сравнительные цепочки < / h3 >
Вы не можете сравнить с переменной рядом операторов:
Это должно быть разбито на два сравнения, каждое против
$ x
.На самом деле это скорее случай выражений в черном списке (из-за эквивалентной ассоциативности оператора). Он синтаксически действителен на нескольких языках в стиле C, но PHP также не интерпретирует его как ожидаемую цепочку сравнения.
Неожиданный < код > < / code > < / h3 >
Операторы больше
>
или меньше<
не имеют пользовательского имени токенизатораT_XXX
. И хотя они могут быть неуместны, как и все остальные, вы чаще видите, как анализатор жалуется на них за неверно процитированные строки и пюре HTML:Это равносильно тому, что строку
" < a href = 'z"
отравнивают>
до буквальной константыHello
, а затем еще<
сравнение. Или, по крайней мере, так видит PHP. Фактической причиной и ошибкой синтаксиса была преждевременная строка"
terming.Также невозможно прикрепить начальные теги PHP:
Смотрите также:
Неожиданно »?«
Если вы пытаетесь использовать нулевой оператор объединения
??
в версии PHP до PHP 7 вы получите эту ошибку.Неожиданно »?', ожидая переменной
Аналогичная ошибка может возникнуть для нулевых типов, как в:
Что снова указывает на использование устаревшей версии PHP (либо версия CLI
php -v
, либо связанный с веб-сервером `phpinfo ();
).Неожиданный T_LNUMBER
Знак
T_LNUMBER
относится к «длинному» / номеру.В PHP и большинстве других языков программирования переменные не могут начинаться с числа. Первый символ должен быть буквенным или подчеркиванием.
*!
Довольно часто подходит для использования
preg_replace
-placeholders" $ 1"
в контексте PHP:Где обратный звонок должен был быть процитирован. (Теперь флаг
/ e
regex устарел. Но иногда он все еще используется неправильно в функцияхpreg_replace_callback
.)То же ограничение идентификатора применяется к свойствам объекта, кстати.
Хотя токенизатор / parser не допускает буквальное
$ 1
в качестве имени переменной, один может использовать$ {{{1}}}
или$ {"1"}
. Что является синтаксическим обходным путем для нестандартных идентификаторов. (Лучше всего думать об этом как о локальном прицеле. Но обычно: предпочитайте простые массивы для таких случаев!)Забавно, но очень не рекомендуется, анализатор PHP позволяет Unicode-идентификаторам; так что
$ con
будет действительным. (В отличие от буквального1
).Неожиданная длина также может возникнуть для объявлений массива - при отсутствии запятых
,
:Или также выполнять вызовы и объявления и другие конструкции:
func (1, 2 3);
функция xy ($ z 2);
для ($ i = 2 3 < $ z)
Поэтому обычно отсутствует один из
;
или,
для разделения списков или выражений.И снова, неправильно процитированные строки являются частым источником случайных чисел:
К таким случаям следует относиться более или менее как к ошибкам неожиданный T_STRING.
Ни функции, ни классы, ни namespaces не могут быть названы, начиная с числа либо:
Почти так же, как для имен переменных.
Неожиданно '='
Это может быть вызвано наличием недопустимых символов в имени переменной. Имена переменных должны следовать этим правилам:
Неожиданное «продолжить» (T_CONTINUE)
«продолжить» - это утверждение (например, для или если), которое должно выглядеть автономно. Он не может быть использован как часть выражения. Частично потому, что продолжение не возвращает значение, но в выражении каждое подвыражение должно приводить к некоторому значению, поэтому общее выражение приводит к значению. В этом разница между утверждением и выражением.
Это означает, что «продолжение» не может использоваться в троичном выражении или любом операторе, который требует возвращаемого значения.
Неожиданный «перерыв» (T_BREAK)
То же самое касается "перерыва"; конечно. Это также не может использоваться в контексте выражения, но является строгим утверждением (на том же уровне, что и
foreach
илиif
block).Неожиданное «возвращение» (T_RETURN)
Теперь это может быть более удивительным для «возврата», но это также просто утверждение уровня блока *. Он возвращает значение (или NULL) в более высокую область / функцию, но не оценивается как само выражение. → То есть: нет смысла делать
return (return (false) ;;
Неожиданное «окончательное время» (T_ENDWHILE)
Синтаксис использует двоеточие - если двоеточия нет, произойдет вышеуказанная ошибка.
Альтернативой этому синтаксису является использование фигурных скобок:
http://php.net/manual/en/control-structures.while.php
Сообщение об ошибке, которое начинает
Parse error: синтаксическая ошибка, неожиданное ':'
, может быть вызвано ошибочной записью статической ссылки классаClass :: $ Variable
какClass: $ Variable
.