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

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版本不兼容造成的,因此请根据平台设置检查供应商的要求。


当前回答

意想不到的“。”

如果您试图在不受支持的PHP版本中使用splat操作符(…),就会发生这种情况。

... 首次在PHP 5.6中可用来捕获函数的可变数量的参数:

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

在PHP 7.4中,可以将它用于Array表达式。

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

其他回答

意想不到的(

现在,在过时的PHP版本中经常可以看到意外的[array括号]。短数组语法从PHP >= 5.4开始可用。旧的安装只支持array()。

$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
         ⇑

数组函数结果解引用同样不适用于旧的PHP版本:

$result = get_whatever()["key"];
                      ⇑

这个错误在PHP中意味着什么?-“语法错误,意外的\[”显示了最常见和实用的解决方案。

不过,最好还是升级PHP安装。对于共享网络托管计划,首先要研究是否可以使用SetHandler php5 56-fcgi来启用新的运行时。

参见:

对函数result→进行解引用的PHP语法,从PHP 5.4开始可能 PHP语法错误,意外的“[” 数组的简写:是否存在像{}或[]这样的文字语法? PHP 5.3.10 vs PHP 5.5.3语法错误 数组()和[]的区别 PHP数组语法解析错误

顺便说一下,如果你对老版本和慢版本的PHP很感兴趣的话,还有预处理器和PHP 5.4语法下转换器。

导致意外语法错误的其他原因

如果不是PHP版本不匹配,那么通常是一个简单的拼写错误或新手语法错误:

You can't use array property declarations/expressions in classes, not even in PHP 7. protected $var["x"] = "Nope"; ⇑ Confusing [ with opening curly braces { or parentheses ( is a common oversight. foreach [$a as $b) ⇑ Or even: function foobar[$a, $b, $c] { ⇑ Or trying to dereference constants (before PHP 5.6) as arrays: $var = const[123]; ⇑ At least PHP interprets that const as a constant name. If you meant to access an array variable (which is the typical cause here), then add the leading $ sigil - so it becomes a $varname. You are trying to use the global keyword on a member of an associative array. This is not valid syntax: global $var['key'];

结束方括号

这种情况比较少见,但是终止数组[括号]也会出现语法错误。

同样,与)括号或}大括号不匹配是常见的: 函数foobar($a, $b, $c] { ⇑ 或者试图结束一个没有数组的数组: $var = 2]; 这通常发生在多行和嵌套数组声明中。 $数组=[1,2,3],4(5、6 (7 [8][9 10]],11),12]],15); ⇑ 如果是,请使用IDE进行括号匹配以查找任何过早的]数组闭包。至少使用更多的空格和换行来缩小范围。

意想不到的“。”

如果您试图在不受支持的PHP版本中使用splat操作符(…),就会发生这种情况。

... 首次在PHP 5.6中可用来捕获函数的可变数量的参数:

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

在PHP 7.4中,可以将它用于Array表达式。

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

意想不到的“=”

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

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

我认为这个话题讨论得太多了/太复杂了。使用IDE是完全避免任何语法错误的方法。我甚至会说,在没有IDE的情况下工作是不专业的。为什么?因为现代ide会在输入每个字符后检查语法。当您编写代码时,整行代码都变成红色,并且有一个很大的警告通知显示语法错误的确切类型和确切位置,那么绝对没有必要搜索其他解决方案。

使用语法检查IDE意味着:

您将(有效地)再也不会遇到语法错误,因为您在输入时就能看到它们。认真对待。

具有语法检查功能的优秀ide(它们都适用于Linux、Windows和Mac):

NetBeans(免费) PHPStorm [$199 USD] Eclipse与PHP插件[免费] Sublime [$80 USD](主要是一个文本编辑器,但可扩展的插件,如PHP语法分析器)

意外的'continue' (T_CONTINUE)

Continue是一个语句(如for或if),必须单独显示。它不能用作表达式的一部分。部分原因是continue不返回值,但在表达式中,每个子表达式都必须产生某个值,因此整个表达式都会产生一个值。这就是语句和表达式的区别。

这意味着continue不能用于三元语句或任何需要返回值的语句。

意外的“中断”(T_BREAK)

休息也是一样;当然可以。它也不能用于表达式上下文,而是一个严格语句(与foreach或if块处于同一级别)。

意外的“返回”(T_RETURN)

对于return来说,这可能更令人惊讶,但这也只是一个块级语句。它确实向更高的作用域/函数返回一个值(或NULL),但它不作为表达式本身计算。→也就是说:return(return(false);;