程序员经常犯错误。可能会出现语法错误。例如:
PHP Parse 错误:语法错误,第 20 行 index.php 中出现意外的“{”
一个意想不到的符号并不总是真正的罪魁祸首。但是行号给出了从哪里开始搜索的粗略概念。
始终查看代码的上下文。语法错误通常在于提到的或前面的代码行。将您的代码与手册中的语法示例进行比较。
用于故障排除的其他链接:
下面的答案总结了常见错误,在下面的列表中找到错误并跳转到带有描述的答案。
意外的 T_STRING
意外的标识符“xxx”
意外的 T_VARIABLE
意外的 '$varname' (T_VARIABLE)意外的 T_CONSTANT_ENCAPSED_STRING
意外的 T_ENCAPSED_AND_WHITESPACE
意外的 $end / 意外的文件结尾
意外的 T_FUNCTION意外
{
意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外意外}
意外(
意外)
意外 T_IF
意外 T_FOREACH
意外 T_FOR
意外 T_WHILE
意外 T_DO
意外 T_PRINT
意外 T_ECHO
意外 T_LNUMBER
工作中...
意外 T_IS_EQUAL
意外 T_IS_GREATER_OR_EQUAL
意外 T_IS_IDENTICAL
意外 T_IS_NOT_EQUAL
意外 T_IS_NOT_IDENTICAL
意外 T_IS_SMALLER_OR_EQUAL
意外<
意外>
输入中的意外字符:'
\
' (ASCII=92) state=1意外的“公共”(T_PUBLIC)
意外的“私有”(T_PRIVATE)
意外的“受保护”(T_PROTECTED)
意外的“最终”(T_FINAL)意外的 T_STATIC
意外的 T_CLASS
意外的“使用”(T_USE)
意外的 T_DNUMBER
Unexpected
,
Unpexected.
Unexpected;
Unexpected*
Unexpected:
Unexpected ':', 期待 ',' 或 ')'
Unexpected&
Unexpected.
意外的 T_STRING
意外的标识符“xxx”
表示找到原始标识符。这可以是不同的:从“裸词”到剩余的常量或函数名,被遗忘的不带引号的字符串,或任何纯文本。示例问题:
带有无效引号的字符串
任何未转义和随机的引号
"
或'
形成无效的表达式。此示例在 double 中使用双引号。这不是真的。解释器会“看到”字符串
"<a href="
和字符串">click here</a>"
(因为字符串是用引号括起来的),但http://example.com
它不会理解它是什么。重要的是要记住使用反斜杠来转义\"
双引号或\'
单引号 - 以外部用于整个字符串的为准(用于熟悉字符串)。比如外面有双引号,那么里面用单引号比较容易,以免混淆,或者转义双引号。单打也一样。将大文本放入HEREDOC或NOWDOC更容易未闭合的行
如果省略结束引号,则语法错误通常会在以后发生。
非编程报价
通常在从书中复制文本时发生。它们可能看起来像这样:
缺少分号
不可见的 Unicode 字符
如果您从 T_STRING 解析器收到关于完全不可疑代码的投诉,如下所示:
您需要使用另一个文本编辑器。甚至是十六进制编辑器。这里看起来像简单的空格和换行符可能包含不可见的常量。这发生在具有编码的文档中
UTF-8 BOM
,您需要进行编码UTF-8 без BOM
转义报价
该符号
\
具有特殊含义。该符号通常\
用于在字符串中转义。为了使包含在相同引号中的字符串中的引号按原样打印,它被转义。那些。行将echo "Jim said \"Hello\"";
输出Jim said "hello"
. 如果您应用该序列\"
,那么它将被视为试图转义引用。所以下面的行会抛出错误转义反斜杠也是正确的:
意外的 T_VARIABLE
意外的“$varname”(T_VARIABLE)
表示存在错误中指定的名称的特定变量不适合当前表达式/语句结构。
错误:
缺少分号
通常,省略分号,并且在下一行有一个变量:
无效的字符串连接
缺少表达式语句
在数组或函数的枚举中
在类属性声明中
只有静态值(唯一定义的)可以分配给属性,而不是表达式。
如果需要将表达式分配给变量,则必须在构造函数或其他一些初始化方法中完成
紧跟在标识符之后的变量
if、for、foreach 语言结构之前/之后缺少括号
Else 不期望条件
在这里你需要要么大括号,要么申请
elseif
(如果它不违反逻辑)闭包所需的括号
传递给闭包的变量必须始终用括号括起来
隐形空间
如前所述。可能有看不见的字符。检查它们(阅读上面的Unexpected T_STRING错误)
关于语法错误的一般信息
### 那个笔记:
如果您的浏览器显示诸如“SyntaxError:非法字符”之类的错误消息,那么这实际上与PHP无关,而是Javascript及其语法错误。
供应商代码中出现语法错误:如果安装或更新供应商的包后出现语法错误,这可能是由于PHP版本不兼容,因此请检查供应商的版本。以及设置平台的要求。
使用像PHPStorm这样的IDE,它总是会告诉你代码是否有问题。注意提示:
有时会由于文件开头的额外字符(尤其是 BOM)而发生错误。确保文件以没有 BOM 的 UTF-8 保存。(如果你需要 utf8)
如果您的网站只是空白并带有白屏,则通常是语法错误的原因。使用此指令启用他们的显示
### 如何解释解析器错误
典型的语法错误信息:
(解析错误:语法错误,意外的T_STRING,预期的 '
;
'在file.php的第217行 )这是语法错误的可能位置。请参阅提到的文件名和行号。
一个标记,例如
T_STRING
,解释了解析器/标记器无法完成的字符。但是,这不一定是语法错误的原因。因此,研究前面几行代码很重要。语法错误通常是较早发生的错误。错误行号正是解析器最终放弃处理它的地方,而不是确切的错误行Unexpected
(
Открывающие круглые скобки обычно следуют за языковыми конструкциями, такими как
if
/foreach
/for
/array
/list
, или начинают арифметическое выражение. Они синтаксически неверны после"strings"
, предыдущих скобок()
, одинокого$
и в некоторых типичных контекстах объявлений. Типичные ошибки:Выражения в параметрах объявленной функции
Параметры в объявлении функции могут быть только литеральными значениями или константными выражениями. То есть выражение
time() + 90000
нельзя использовать в качестве дефолтного значения параметра функциию. Тем не менее при вызове функции можно свободно использовать выражение:Выражения в свойствах класса
Как и ошибка выше, нельзя применять выражения для свойств класса, т.е.
Если необходимо что-то вычислить, то данные вычисления/выражения стОит помеестить в конструктор класса.
Единственное, PHP 7 позволяет написать
public $property = 1 + 2 + 3;
. Но это посзволительно, т.к., по сути, это выражение с константными значениями, не вычисляемое "на лету".isset(()), empty, key, next, current
И
isset()
иempty()
являются встроенными языковыми конструкциями языка, а не функциями, им необходим прямой доступ к переменной. Если вы непреднамеренно добавите слишком много скобок, то вы создадите доп. выражение:Для PHP <= 5.4 будет ошибка
Parse error: syntax error, unexpected '('
Для PHP <= 7.0 будет ошибка
Fatal error: Cannot use isset() on the result of an expression
Начиная с версии 7.0 - ошибки не будет
Unexpected
)
Висячая запятая при вызове функции/метода
В новых версиях языка позволены висячие запятые при нициализации массивов или списков (а также в объявлении функций/методов), но не при вызове функций/методов
Незавершённые выражения
Например если забыли в арифметическом выражении, то синтаксический анализатор сдается. Потому что он не знает как интерпретировать это:
Но если забыли закрывающую скобку вдобавок, то получите жалобу о неожиданной точке с запятой.
Foreach as
constant
Если забыть добавить доллар к переменной:
PHP здесь иногда говорит, что вместо этого ожидался
->
или?->
. Посколькуclass->variable
мог бы удовлетворить ожидаемому выражению.Unexpected
{
Фигурные скобки
{
и}
окружают блоки кода. И синтаксические ошибки о них обычно указывают на какую-то неправильную вложенность.Unmatched subexpressions in an
if
(Несовпадающие подвыражения) вif
Чаще всего несбалансированные
(
и)
являются причиной, если парсер жалуется на открывающуюся фигурную скобку{
, которая появляется слишком рано. Простой пример:Необходимо посчитать все открывающие и закрывающие скобки и сопоставить их количество. Также используйте IDE, которая помогает в этом и не пишите код без пробелов. Удобочитаемость имеет значение.
{ and } в выражениях
Нельзя оборачивать выражения в скобки.
Придётся выражение вынести в переменную и подставлять уже её:
Unexpected
}
Когда получаете ошибку "unexpected
}
", чаще всего означает, что закрывали блок кода слишком рано.Последнее выражение в блоке и потеря точки с запятой
Недопустимая вложенность блоков/Forgotten
{
(забытая{
)Блок кода был
}
закрыт слишком рано, или забыли открытую скобку{
:В приведенном выше фрагменте
if
не было открывающей фигурной скобки{
. Таким образом, закрывающая}
ниже стала излишней. И поэтому следующая закрывающая}
, предназначенная для функции, не была связана с исходной открывающей фигурной скобкой{
.Unexpected
{
, expecting(
Языковые конструкции, требующие условия/объявления и блока кода, вызовут эту ошибку.
Список параметров функции/метода
Условные конструкции
То же самое для частых используемых конструкций:
for
/foreach
,while
/do
, etc.Как минимум всегда смотрите документацию, чтобы сравнить, правильно ли вы пишите ne или иную конструкцию/функцию/метод/класс и т.д.
意外的 T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE
Предупреждения T_ENCAPSED… появляются в контексте строки с двойными кавычками, в то время как строки T_CONSTANT… часто возникают в простых выражениях или операторах PHP.
Ошибки:
Неправильная интерполяция переменных
Ключи массива должны быть в кавычках. Но в строках с двойными кавычками (или HEREDOC) это не так. Парсер жалуется на содержащуюся в одинарных кавычках строку.
Можно использовать PHP2-style для написания ключей мамссивов внутри строки
Но лучше изучить фигурный синтаксис и использовать его. Он позволяет писать ключи массива как обычно:
Отсутствует конкатенация
Отсутствует начальная кавычка
Пропущена запятая в массиве
Пропущена запятая в аргументах функции/метода
Строка закрыта слишком поздно
Отступ в HEREDOC
До версии 7.3 закрывающий идентификатор должен был находиться в самом начале новой строки. Поэтому код ниже вызовет ошибку
Unexpected $end
Unexpected end of file
Ошибка означает, что код закончился, в то время как парсер ожидает больше кода. (Сообщение немного вводит в заблуждение, если понимать его буквально. Речь идет не о переменной с именем «$end», как иногда предполагают новички. Оно относится к «концу файла»). Причина: несовпадение количества открывающих и закрывающих фигурных скобок.
Почти всегда речь идет об отсутствующей закрывающей фигурной скобке
}
для закрытия предшествующих блоков кода. Это говорит о том, что синтаксический анализатор ожидает найти закрывающую скобку}
, но на самом деле достиг конца файла.}
была утеряна. Большинство IDE выделяют совпадающие фигурные скобки, квадратные скобки и круглые скобки. Что позволяет довольно легко проверить соответствие:Отступ в HEREDOC
До версии 7.3 закрывающий идентификатор должен был находиться в самом начале новой строки. Поэтому код ниже может вызывать ошибку
Заэкранированная кавычка
Символ
\
имеет особое значение. Часто символ\
применяют для экранирования в строках. Чтобы кавычка внутри строки, которая обёрнута в такие же кавычки, печаталась как есть, то её экранируют. Т.е. строкаecho "Jim said \"Hello\"";
выведетJim said "hello"
. Если применить последовательность\"
, то она будет расценена как попытка экранирования кавычки. Поэтому строка ниже, выдаст ошибкуправильно будет экранировать обратные слэши тоже:
С другой стороны, PHP обычно преобразует пути в стиле Unix (например,
"C:/xampp/htdocs/"
) в правильный путь для Windows.Альтернативный синтаксис
Несколько реже вы можете увидеть эту синтаксическую ошибку при использовании альтернативного синтаксиса для блоков операторов/кодов в шаблонах. Используя
if:
иelse:
отсутствуетendif;
, например (т.е. закрывающий тег)Unexpected T_FUNCTION
Может возникнуть например в версии PHP ниже 5.3.0, когда не было ещё анонимных функций. В некоторые функции, такие как
array_map
нужно было передать имя функции обработчика, например$range = array_map( "name_of_function_to_call", $myArray );
. Так что минимум надо проверить версию PHP и проверить что именно на вход ожадает текущая функция. И принять решение: повысить версию PHP или переписать под старый стиль: создать отдельно функцию и во вторую передать имя первой.Unexpected
[
Часто возникает в старых версиях PHP. В версии PHP >= 5.4 стал возможен сокращённый синтаксис объявления массивов
Разыменование массивов также с версии 5.4. Оно позволяет, например, сразу же обратиться к ключу массива, который вернула функция.
это же касается и встроенных функций, например
explode
и других, которые возвращают массивОбязательно проверьте версию PHP
Другие варианты:
Нельзя в свойствах метода сразу внести данные в ячейку массива
Если это необходимо - делайте это в конструкторе или каком-либо инициализирующием методе
Случайно опеатались и вместо другой скобки поставили квадратную
или даже
Вы пытаетесь использовать ключевое слово
global
для члена ассоциативного массива. Это недопустимый синтаксис:Unexpected
]
Случайно опеатались и вместо другой скобки поставили квадратную
Пытаетесь закончить массив там, где его нет:
Часто это возникает во вложенных массивах
Используйте IDE для сопоставления скобок и нормально форматируйте код %))
Unexpected T_IF
Unexpected T_FOREACH
Unexpected T_FOR
Unexpected T_WHILE
Unexpected T_DO
Unexpected T_ECHO
Частые проблемы с операторами
if
,foreach
,for
,while
,list
,global
,return
,do
,print
,echo
Точка с запятой не там
Довольно часто пропущена точка с запятой в предыдущей строке
Код в классе, находится вне методов
Используются зарезервированные ключевые слова в качестве идентификаторов
Нельзя использовать
do
,if
и другие языковые конструкции в качестве имён функций/методов или имён классов.СтоИт точка с запятой вместо двоеточия (:) или фигурной скобки ({) после блока управления
Управляющие структуры обычно заключены в фигурные скобки, но в альтернативном синтаксисе могут использоваться двоеточия. Если там случайно использовать точку с запятой, то преждевременно закрывается этот самый блок:
Unexpected T_LNUMBER
Недопустимые имена переменных
Имена переменных не могут начинаться с цифры. Первый символ должен быть буквенным или символом подчеркивания.
Довольно часто появляется при использовании
preg_replace
-заполнителей"$1"
но в контексте функций непосредственно PHP:Там, где callback - должны были быть кавычки. Однако их пропустили (P.S. флаг
/e
устарел, но иногда он всё еще неправильно используется вpreg_replace_callback
)Хотя токенизатор/парсер не допускает буквального
$1
в качестве имени переменной, можно использовать${1}
или${"1"}
. Это синтаксический обходной путь для нестандартных идентификаторов. (Лучше думать об этом как о поиске в локальной области. Но в целом: для таких случаев предпочитайте простые массивы!)Обращение к нумерованному ключу объекта через стрелочку ->
Обычно возникает в объектах типа
stdClass Object
, появляющиеся послеjson_decode
без флагаtrue
Правильно будет:
Пропущены запятые в объявлении массивов
Или подобное, но в параметрах функции или конструкций:
Обычно один из знаков, таких как
;
или,
пропущен при разделении списка выражений.Ошибка расстановки кавычек, несовпадение кавычек
Подробно описано про кавычки в Unexpected T_STRING errors.
Другие идентификаторы
Ни функции, ни классы, ни пространства имен не могут начинаться с числа:
Unexpected '?'
Если вы пытаетесь использовать тег
<?php
внутри другого такого же тега<?php
** Для PHP версий 4.3.1, 4.3.5 - 4.3.11, 4.4.0 - 4.4.1, 5.0.0 - 5.0.5, 4.4.2 - 4.4.9, 5.1.0 - 5.1.6, 5.2.0 - 5.2.17, 5.3.0 - 5.3.29, 5.4.0 - 5.4.45, 5.5.0 - 5.5.38, 5.6.0 - 5.6.40, 7.0.0 - 7.0.33, 7.1.0 - 7.1.33, 7.2.0 - 7.2.34, 7.3.0 - 7.3.31, 7.4.0 - 7.4.24
Если используется оператор null coalescing operator
??
в версиях PHP ниже, чем PHP 7Unexpected '?', expecting variable
Аналогичная ошибка может возникнуть для типов, допускающих значение NULL, например:
Что снова указывает на то, что используется устаревшая версия PHP (то же касается CLI). Проверьте версию PHP через
phpinfo();
. Необходимо будет либо повысить версию, либо переписать код под старые версии, без использования нового синтаксисаUnexpected 'continue' (T_CONTINUE)
Оператор
continue
используется только внутри циклических структур для пропуска оставшейся части текущей итерации цикла и, при соблюдении условий, начала следующей итерации.continue
не возвращает значения Таким образомcontinue
нельзя использовать в тернарном операторе или любом операторе, требующем возвращаемого значения (return).Unexpected 'break' (T_BREAK)
То же самое касаестся
break;
. Нельзя использовать в выражениях (те, что могут вернуть значение). Используется внутри for, foreach, while, do-while или switch.Unexpected 'return' (T_RETURN)
Если на предыдущих строках произошла синтакцическая ошибка, то при приходе к слову
return
будет подобная ошибка. Например:или
При данной ошибке ищите синтаксическую ошибку раньше указанного места в тексте ошибки, а не прямо на этой же строчке.
Unexpected '='
Может быть вызвано наличием недопустимых символов в имени переменной. Имена переменных должны соответствовать следующим правилам:
Unexpected T_PAAMAYIM_NEKUDOTAYIM
T_PAAMAYIM_NEKUDOTAYIM - это наименование для двойного двоеточия
::
на иврите ¯\_(ツ)_/¯Происходит использование двойного двоеточия, вместо стрелочки объекта (статический вызов, вместо вызова метода в нестатическом контексте).
Например в коде указано
$cnf::getConfig($key);
, а должно быть$cnf->getConfig($key);
Это было возможно в ранних версиях. Возможно ошибка появилась после переноса куда-либо (например нахостинг). Поэтому проверьте версию PHP и либо установится такую же версию, на которой было разработано приложение, либо измените вызов свойства/метода на вызов их не в статическом виде
Unexpected T_OBJECT_OPERATOR
В очень старых версиях PHP (4) нельзя делать "method chaining", т.е. консрукция ниже не сработает
В версиях ниже *PHP 5.4* нельзя вызвать метод у только что созданного объекта
можно вначале создать объект, а только потом вызвать у него метод:
Также нужно обратить внимание на круглые скобки, писать
new PurchaseOrderFactory->instance();
нельзя, это невалидно!Пропущен знак доллара у переменной.
Например написано
mysqli->query
, а должно быть$mysqli->query
или написаноthis->transform($lessons)
а должно быть$this->transform($lessons)
Unexpected T_DOUBLE_ARROW
Причины:
Использование `=>` при описании массива, но при этом ключевое слово объявления массива было забыто:
должно быть
Пропущена запятая перед объявлением массива
должно быть
Пропущена какой-то закрывающий элемент в пересислении массива
Unexpected T_BOOLEAN_OR Unexpected T_BOOLEAN_AND
Возникают, как правило, вследствие несовпадения открывающих и закрывающих круглых скобок. Пример
или
или
解决方案:检查所有代码是否匹配括号!如有必要,然后将复杂的结构移动到单独的变量中,以免混淆并使用它们。例子
这段代码会更容易阅读,如下所示: