每个人都会遇到语法错误。即使是经验丰富的程序员也会出现拼写错误。对于新人来说,这只是学习过程的一部分。然而,通常很容易解释如下错误消息:

PHP解析错误:语法错误,在index.php第20行中出现意外的“{”

意想不到的符号并不总是真正的罪魁祸首。但是行号给出了从哪里开始查找的大致概念。

总是查看代码上下文。语法错误通常隐藏在前面提到的或前面的代码行中。将您的代码与手册中的语法示例进行比较。

但并不是所有情况都是一样的。但是有一些通用的步骤可以解决语法错误。 本文总结了常见的陷阱:

Unexpected T_STRING Unexpected T_VARIABLE Unexpected '$varname' (T_VARIABLE) Unexpected T_CONSTANT_ENCAPSED_STRING Unexpected T_ENCAPSED_AND_WHITESPACE Unexpected $end Unexpected 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 ? Unexpected continue (T_CONTINUE)Unexpected continue (T_BREAK)Unexpected continue (T_RETURN) Unexpected '=' Unexpected T_INLINE_HTML… Unexpected T_PAAMAYIM_NEKUDOTAYIM… Unexpected T_OBJECT_OPERATOR… Unexpected T_DOUBLE_ARROW… Unexpected T_SL… Unexpected T_BOOLEAN_OR… Unexpected T_BOOLEAN_AND… Unexpected T_IS_EQUAL Unexpected T_IS_GREATER_OR_EQUAL Unexpected T_IS_IDENTICAL Unexpected T_IS_NOT_EQUAL Unexpected T_IS_NOT_IDENTICAL Unexpected T_IS_SMALLER_OR_EQUAL Unexpected < Unexpected > 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)… Unexpected T_STATIC… Unexpected T_CLASS… Unexpected 'use' (T_USE) Unexpected T_DNUMBER Unexpected , (comma) Unpexected . (period) Unexpected ; (semicolon) Unexpected * (asterisk) Unexpected : (colon) Unexpected ':', expecting ',' or ')' Unexpected & (call-time pass-by-reference) Unexpected .

密切相关的参考文献:

这个错误在PHP中意味着什么?(运行时错误) 解析错误:语法错误,意外的T_XXX 解析错误:语法错误,意外的T_ENCAPSED_AND_WHITESPACE 解析错误:语法错误,意外的T_VARIABLE 这个符号在PHP中是什么意思?(语言标记) 这些“聪明”的引号对PHP毫无意义

And:

php.net上的PHP手册和它的各种语言标记 或者维基百科关于PHP的语法介绍。 最后是我们的php标签维基。

虽然Stack Overflow也欢迎新手程序员,但它主要针对的是专业编程问题。

回答每个人的编码错误和狭窄的拼写错误被认为是离题了。 因此,在发布语法修正请求之前,请花时间遵循基本步骤。 如果你仍然必须这样做,请展示你自己的解决方案,尝试修复,以及你对看起来或可能错误的思考过程。

如果您的浏览器显示错误消息,如“SyntaxError: illegal character”,那么它实际上不是php相关的,而是javascript语法错误。


供应商代码引起的语法错误:最后,考虑一下,如果语法错误不是由编辑代码库引起的,而是在外部供应商包安装或升级之后引起的,则可能是由于PHP版本不兼容造成的,因此请根据平台设置检查供应商的要求。


当前回答

意外的'endwhile' (T_ENDWHILE)

语法使用冒号-如果没有冒号,就会发生上述错误。

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

这种语法的替代方法是使用花括号:

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

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

其他回答

意想不到的“?”

如果您试图使用<?PHP <?PHP这个错误将被返回*。

$var = 'hello '<?php echo 'world'; ?>;

*为PHP版本4.3.1,4.3.5——4.3.11 4.4.0——4.1.1 5.0.0——5.0.5 10/24/11——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.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


如果您正在尝试使用空合并操作符??在php7之前的版本中,你会得到这个错误。

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

意想不到的”?,期望变量

可空类型也会出现类似的错误,如下所示:

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

这再次表明使用了过时的PHP版本(CLI版本PHP -v或web服务器绑定的phpinfo();)。

对于VS Code的新手,如果你看到语法错误,检查你是否保存了文件。如果你有一个错误的语法,保存文件,然后在不保存的情况下修复语法,VS Code会继续显示错误。只有保存文件后,错误信息才会消失。

意想不到的“=”

这可能是由于在变量名中使用无效字符造成的。变量名称必须遵循以下规则:

变量名与PHP中的其他标签遵循相同的规则。有效变量名以字母或下划线开头,后面跟着任意数量的字母、数字或下划线。作为正则表达式,它可以这样表示:'[a- za - z_ \x7f-\xff][a- za - z0 -9_\x7f-\xff]*'

意想不到的美元结束

当PHP谈到“意外的$end”时,这意味着您的代码在解析器期望更多代码时结束了。(如果从字面上理解,这个信息有点误导。它不是关于一个名为“$end”的变量,就像新来者有时认为的那样。它指的是“文件的结束”,EOF。)

原因:代码块/和函数或类声明的{和}不平衡。

它几乎总是缺少一个}花括号来关闭前面的代码块。它的意思是,解析器希望找到一个结束},但实际上到达了文件的末尾。

同样,使用适当的缩进来避免此类问题。 使用带有括号匹配的IDE,找出}错误的地方。 在大多数ide和文本编辑器中都有快捷键: NetBeans, PhpStorm, Komodo: Ctrl[和Ctrl] Eclipse, Aptana: CtrlShiftP Atom, Sublime: Ctrlm - Zend Studio Ctrlm Geany, notepad++: CtrlB - Joe: CtrlG - Emacs: C-M-n - Vim: %

大多数ide还突出显示匹配的大括号、方括号和圆括号。 这使得检查它们的相关性变得非常容易:

无端接的表达式

对于未结束的表达式或语句,也会出现意外的$end语法/解析器错误:

$var = func(1, ?>EOF

因此,首先查看脚本的末尾。拖尾;在任何PHP脚本中,最后一条语句通常是多余的。但你应该有一个。正是因为它缩小了这些语法问题的范围。特别是在您发现自己在脚本末尾添加了更多语句之后。

缩进的HEREDOC标记

另一种常见情况出现在HEREDOC或NOWDOC字符串中。如果前面有空格、制表符等,终止标记将被忽略:

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

因此,解析器假定HEREDOC字符串将一直持续到文件的末尾(因此是“意外的$end”)。几乎所有的ide和语法高亮编辑器都会明确显示或发出警告。

转义的引号

如果你在字符串中使用\,它有一个特殊的含义。这称为“转义字符”,通常告诉解析器按字面意思取下一个字符。

示例:echo 'Jim said \'Hello\ ";将打印Jim说'hello'

如果转义字符串的结束引号,结束引号将被字面上理解,而不是像预期的那样,即作为字符串的一部分而不是结束字符串的可打印引号。这通常会在打开下一个字符串后或脚本结束时显示为解析错误。

在Windows中指定路径时非常常见的错误:“C:\xampp\htdocs\”是错误的。你需要“C:\\xampp\\htdocs\\ \”。另外,PHP通常会转换unix风格的路径(例如。“C:/xampp/htdocs/”)到Windows的正确路径。

替代语法

在模板中使用语句/代码块的替代语法时,很少会看到这种语法错误。使用if:和else:和一个缺失的endif;为例。

参见:

PHP语法错误“意外$end” 解析错误:语法错误,在我的PHP代码文件意外结束 解析错误语法错误文件意外结束,使用PHP PHP解析错误:语法错误,CodeIgniter视图中的文件意外结束 解析错误:语法错误,文件意外结束(注册脚本) “解析错误:语法错误,意外$end”为我的uni注册分配 修复PHP错误:PHP错误#3:文件意外结束

意想不到的:

1. PHP 8命名参数语法

Unexpected ':', expected ',' or ')'

如果试图在PHP < 8的版本中使用PHP 8的新命名形参功能,将会出现以下错误:

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

解决方案:

将PHP版本升级到PHP 8.0.0或更高版本 不要使用命名参数(按照预期的顺序传递参数)

2. 裁剪类::分隔符

以“解析错误:语法错误,意外的‘:’”开头的错误消息可能是由于错误地将类静态引用class::$Variable写成class:$Variable而引起的。