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

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 <?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();)。

其他回答

意想不到的“?”

如果您试图使用<?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();)。

意想不到的“。”

如果您试图在不受支持的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'];

意想不到的:

1. PHP 8命名参数语法

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

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

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

解决方案:

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

2. 裁剪类::分隔符

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

意想不到的(

现在,在过时的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进行括号匹配以查找任何过早的]数组闭包。至少使用更多的空格和换行来缩小范围。

意想不到的T_LNUMBER

令牌T_LNUMBER指向一个“长”/ number。

Invalid variable names In PHP, and most other programming languages, variables cannot start with a number. The first character must be alphabetic or an underscore. $1 // Bad $_1 // Good Quite often comes up for using preg_replace-placeholders "$1" in PHP context: # ↓ ⇓ ↓ preg_replace("/#(\w+)/e", strtopupper($1) ) Where the callback should have been quoted. (Now the /e regex flag has been deprecated. But it's sometimes still misused in preg_replace_callback functions.) The same identifier constraint applies to object properties, btw. ↓ $json->0->value While the tokenizer/parser does not allow a literal $1 as variable name, one could use ${1} or ${"1"}. Which is a syntactic workaround for non-standard identifiers. (It's best to think of it as a local scope lookup. But generally: prefer plain arrays for such cases!) Amusingly, but very much not recommended, PHPs parser allows Unicode-identifiers; such that $➊ would be valid. (Unlike a literal 1). Stray array entry An unexpected long can also occur for array declarations - when missing , commas: # ↓ ↓ $xy = array(1 2 3); Or likewise function calls and declarations, and other constructs: func(1, 2 3); function xy($z 2); for ($i=2 3<$z) So usually there's one of ; or , missing for separating lists or expressions. Misquoted HTML And again, misquoted strings are a frequent source of stray numbers: # ↓ ↓ echo "<td colspan="3">something bad</td>"; Such cases should be treated more or less like Unexpected T_STRING errors. Other identifiers Neither functions, classes, nor namespaces can be named beginning with a number either: ↓ function 123shop() { Pretty much the same as for variable names.