每个人都会遇到语法错误。即使是有经验的程序员也会出现错别字。对于新人来说,这只是学习过程的一部分。然而,通常很容易解释这样的错误信息。
PHP解析错误:语法错误,意外的'{' in index.php on line 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] (https://stackoverflow.com/a/18092318)- Unexpected T_LNUMBER
- [Unexpected ? ] (//stackoverflow.com/a/48670368)
- 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
未预期的T_IS_GREATER_OR_EQUAL
意外的T_IS_IDENTICAL
意外的T_IS_NOT_EQUAL
意外的T_IS_NOT_IDENTICAL
意外的T_IS_SMALLER_OR_EQUAL
未料到的<
未预期的>
- 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) ] (https://stackoverflow.com/questions/13341378/php-parse-error-syntax-error-unexpected-t-public) ...- Unexpected T_STATIC...
- Unpexected
.
(句号)- Unexpected
;
(分号).- Unexpected
*
(星号).- 意外的
:
(冒号) 密切相关的参考资料。- 这个错误在PHP中是什么意思?(运行时错误)
- 解析错误:语法错误,意外的T_XXX
- 解析错误:语法错误,意外的T_ENCAPSED_AND_WHITESPACE
- 解析错误:语法错误,意外的T_VARIABLE
- 这个符号在PHP中是什么意思?(语言标记)
- 那些
""
聪明的`''引号对PHP毫无意义 还有。
- php.net上的PHP手册和它的各种语言标记
- 或者维基百科的关于PHP的语法介绍。
- 最后是我们的php标签-维基,当然。 虽然Stack Overflow也欢迎菜鸟程序员,但它主要是针对专业的编程问题。 *回答每个人的编码错误和狭义的错别字被认为是偏离主题的。
- 所以请花时间按照基本步骤,在发布语法修复请求之前。
如果你仍然需要,请展示你自己的解决举措,尝试修复,以及你对看起来或可能是错误的思考过程。 如果你的*浏览器显示错误信息,如"SyntaxError: illegal character",那么它实际上与[tag:php]无关,而是一个[tag:javascript]-语法错误。
在供应商代码中出现的语法错误:最后,考虑到如果语法错误不是通过编辑你的代码库而出现的,而是在外部供应商的软件包安装或升级后出现的,这可能是由于PHP版本不兼容,所以要根据你的平台设置检查供应商的要求。
PHP 属于 C-style 和 imperative 编程语言。它有严格的语法规则,当遇到错位的符号或标识符时,它无法恢复。它不能猜测你的编码意图。
有一些基本的预防措施,你可以经常采取。
一个典型的语法错误信息是这样的
解析错误: 语法错误, unexpected T_STRING, expecting '
;
' in file.php on line 217. 其中列出了一个语法错误的位置。请看提到的文件名和行号。 一个moniker如T_STRING
解释了解析器/标记器最终不能处理的符号。不过,这不一定是语法错误的原因。 查看**之前的代码行也是很重要的。通常情况下,语法错误只是之前发生的误操作。错误行号只是解析器最终放弃处理的地方。解决语法错误
有很多方法可以缩小和解决语法错误。
;
分号在前面的行尾/语句中缺失。(至少从文体的角度看是这样。<!--当然,你可以在PHP告诉你问题的那一行的开头加上它,解析器就会满意。-->){
代码块}
被不正确地封闭或嵌套,你可能需要在源代码上更进一步调查。使用适当的代码缩进来简化这个问题。+-*/.
也应该被染成不同的颜色。否则,它们可能会出现在错误的上下文中。"
或'
字符串标记。? :
条件操作符可以压缩代码,确实很有用。但它并不是在所有情况下都有助于可读性。在不熟悉的情况下,更倾向于使用普通的if
语句。if:
/elseif:
/endif;
)在模板中很常见,但可以说不如正常的{
代码``块容易掌握。;
。"
或'
的字符串引号不匹配,以及内部未转录的引号。.
的连接。(
括号)
。在报告行中计算它们。它们的数量是否相等?grep -color -P -n "\[\x80-\xFF\]" file.php
作为查找非ASCII符号的第一项措施。//
或#
注释时才会出现这个问题。多行/*...*/
注释很少会干扰解析器,因为断行被忽略了。php -v
用于命令行解释器<?php phpinfo();
用于通过webserver调用的那个。
如果你的网站只是空白,那么通常是语法错误造成的。 用以下方法启用它们的显示。
error_reporting = E_ALL
.display_errors = 1
。
一般在你的php.ini
,或者通过.htaccess
为mod_php。
甚至是.user.ini`的FastCGI设置。
在破损的脚本中启用它为时已晚,因为 PHP 甚至不能解释/运行第一行。一个快速的解决方法是制作一个封装脚本,例如test.php
。<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
然后通过访问这个包装脚本来调用失败的代码。
启用PHP的error_log'也有帮助,当一个脚本崩溃并出现HTTP 500响应时,可以查看你的[webserver的
error.log']21。
一个 "意外的T_VARIABLE'"意味着有一个字面的
$variable'名称,它不适合当前的表达式/语句结构。
。
1.
它最常见的是表示[前一行缺少分号](https://stackoverflow.com/questions/9135784/syntax-error-unexpected-t-variable)。语句后面的变量赋值是一个很好的指示器,可以在哪里查看。
⇓
func1()
$var = 1 + 2; # 第+2行的解析错误
2.
一个经常发生的错误是字符串连接被遗忘的.
操作符。
⇓
print "这里有一个值。" $value。
Btw,你应该更喜欢字符串插值(双引号中的基本变量),只要这有助于可读性。这就避免了这些语法问题。
字符串插值是脚本语言的核心功能。利用它并不丢人。忽略任何关于变量". "连接的微观优化建议是快的。它不是。
3.
当然,同样的问题也会出现在其他表达式中,例如算术运算。
⇓
print 4 + 7 $var;
PHP不能*猜测*这里的变量是否应该被加、减或比较等等。
4.
语法列表也是如此,比如在数组人口中,解析器也会指示预期的逗号`,`,例如。
⇓
$var = array("1" => $val, $val2, $val3 $val4)。
或者函数参数列表。
⇓
函数 myfunc($param1, $param2 $param3, $param4)
同样,你是否在`list`或`global`语句中看到这种情况,或者在`for`循环中缺少`;`分号的时候。
5.
这个解析器错误也发生在[类声明中](https://stackoverflow.com/questions/5122729/im-getting-a-syntax-error-unexpected-t-variable-error-i-dont-see-what-im)。你只能分配静态常量,不能分配表达式。因此,解析器抱怨说变量是被分配的数据。
class xyz { ⇓
var $value = $_GET["input"];
不匹配的`}`闭合的大括号尤其会导致这里。如果一个方法被过早地终止(使用适当的缩进!),那么一个游离变量通常会被误放到类的声明体中。
6.
你也不能让[变量跟在标识符后面](https://stackoverflow.com/questions/12194156/php-syntax-error-unexpected-t-variable)直接出现。
⇓
$this->myFunc$VAR()。
Btw,这是一个常见的例子,其目的也许是使用[可变变量](http://php.net/variables.variable)。在这种情况下,用`$this->{"myFunc$VAR"}();`为例进行变量属性查询。
> 请记住,使用可变变量应该是一个例外。新来的人经常试图过于随意地使用它们,甚至在数组会更简单和更合适的情况下。
7.
匆忙打字可能导致忘记了 "if "和 "if "的开头小括号。
if
和for
以及foreach
语句。
⇓
foreach $array as $key) {
解决方案:在语句和变量之间添加缺失的开头"("。
⇓
else ($var >= 0)
解决方案。删除else
中的条件或使用elseif
。
⇓
function() 使用$var {}
解决方案。在"$var "周围添加括号。
10.
正如[参考答案](https://stackoverflow.com/a/18050072/345031)中提到的 "不可见的游离Unicode"(如[非断裂空格](https://en.wikipedia.org/wiki/Non-breaking_space)),你可能也会看到这个错误,对于不怀好意的代码,如。
<?php
⇐
$var = new PDO(...)。
这在文件的开头和复制粘贴的代码中相当普遍。如果你的代码在视觉上不包含语法问题,请用十六进制编辑器检查。
`T_STRING'是一个有点错误的名称.它并不是指一个带引号的 "字符串"。它意味着遇到了一个原始标识符。它的范围可以从 "空白 "字词到剩余的 "CONSTANT "或函数名,被遗忘的未加引号的字符串,或任何纯文本。 1.
双引号,或者
单引号--这取决于哪种被用作字符串包围。
"
双引号。"
,那么以后通常会出现语法错误。一个未结束的字符串通常会消耗一点代码,直到下一个预定的字符串值。
⇓
echo "Some text", $a_variable, "and some runaway string ;
success("完成")。
⇯
那么解析器可能抗议的不仅仅是字面的T_STRING
s。另一个经常出现的变体是对未加引号的字面HTML出现Unexpected '>'
。
3."这些 "被解释为一个常数标识符。但任何后面的文字字面都被解析器看作是一个裸字/T_STRING。 4.<h3>缺少分号;再次</h3>。 如果你在前几行有一个未结束的表达式,那么下面的任何语句或语言结构都会被看作是原始标识符。 ⇓ func1() function2()。 PHP就不知道你是想在两个函数之后运行它们,还是想把它们的结果相乘、相加、相比较,还是只运行一个
||或另一个。 5.<h3>PHP脚本中短的开放标签和<code><?xml</code>标题</h3>。 这是很不常见的。但是如果 short_open_tags 被启用,那么你就不能在 PHP 脚本中[以 XML 声明][5] 开始。 ⇓ <?xml version="1.0"?>。 PHP会看到`<?`并将其据为己有。它不会理解这个游离的`xml`是用来做什么的。它将被解释为常量。但是`version`会被看作是另一个字面/常量。由于解析器不能理解两个后续的字面符号/值,中间没有表达式运算符,这将是一个解析器的失败。 6.<h3>不可见的Unicode字符</h3>。 导致语法错误的一个最可怕的原因是Unicode符号,例如[非破译空格][6]。PHP允许Unicode字符作为标识符名称。如果你得到一个T_STRING解析器的投诉,完全不可疑的代码,如。 <?php 打印123。 你需要拿出另一个文本编辑器。甚至是一个十六进制的编辑器。这里看起来像普通的空格和换行,但可能包含不可见的常数。基于Java的IDE有时会对UTF-8 BOM内的混杂、零宽度的空格、段落分隔符等视而不见。试着重新编辑所有的内容,删除空白,然后重新添加正常的空格。 你可以在每一行的开头添加多余的`;`语句分隔符来缩小范围。 <?php ;打印123。 这里多余的`;`分号将把前面的不可见字符转换成未定义的常量引用(表达式为语句)。这反过来使PHP产生一个有用的通知。 7.<h3>变量名前面缺少`$`符号</h3>。 [PHP中的变量][7]用美元符号表示,后面是变量的名称。 美元符号(`$`)是一个[标志][8],标志着标识符是一个变量的名称。如果没有这个标志,标识符可能是一个[语言关键字][9]或一个[常量][10]。 这是一个常见的错误,当PHP代码是[从其他语言编写的代码 "翻译 "过来的][11](C、Java、JavaScript等)。在这种情况下,变量类型的声明(当原始代码是用一种使用类型化变量的语言写的时候)也可能偷偷摸摸地产生这个错误。 8.<h3>偷跑的引号</h3 如果你在一个字符串中使用
,它有一个特殊的含义。这被称为"转义字符",通常告诉解析器按字面意思理解下一个字符。
例如:echo 'Jim said\'Hello\';
将打印Jim said 'Hello'
。
如果你转义了一个字符串的结束语,结束语将被按字面意思理解,而不是按原意理解,即作为字符串的一部分的可打印引号,而不是关闭字符串。这将显示为一个解析错误,通常是在你打开下一个字符串之后或在脚本的最后。
在Windows中指定路径时非常常见的错误:"C:\xampp\htdocs\"是错误的。你需要
"C:\xampp\htdocs\"。