每个人都会遇到语法错误。即使是经验丰富的程序员也会出现拼写错误。对于新人来说,这只是学习过程的一部分。然而,通常很容易解释如下错误消息:
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'];
意想不到的(
现在,在过时的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.