PHP解析/语法错误;以及如何解决这些错误?

每个人都会遇到语法错误。即使是有经验的程序员也会出现错别字。对于新人来说,这只是学习过程的一部分。然而,通常很容易解释这样的错误信息。

PHP解析错误:语法错误,意外的'{' in index.php on line 20 意外的符号并不总是真正的罪魁祸首。但从行号可以大致知道从哪里开始查找。 始终查看代码上下文。语法错误往往隐藏在提到的前几行代码中。将你的代码与手册中的语法例子进行比较。 虽然不是每一种情况都能匹配。然而,有一些解决语法错误的**的一般步骤。 这个参考文献总结了常见的陷阱。

  • php.net上的PHP手册和它的各种语言标记
  • 或者维基百科的关于PHP的语法介绍
  • 最后是我们的php标签-维基,当然。 虽然Stack Overflow也欢迎菜鸟程序员,但它主要是针对专业的编程问题。 *回答每个人的编码错误和狭义的错别字被认为是偏离主题的。
  • 所以请花时间按照基本步骤,在发布语法修复请求之前。
  • 如果你仍然需要,请展示你自己的解决举措,尝试修复,以及你对看起来或可能是错误的思考过程。 如果你的*浏览器显示错误信息,如"SyntaxError: illegal character",那么它实际上与[tag:php]无关,而是一个[tag:javascript]-语法错误

    在供应商代码中出现的语法错误:最后,考虑到如果语法错误不是通过编辑你的代码库而出现的,而是在外部供应商的软件包安装或升级后出现的,这可能是由于PHP版本不兼容,所以要根据你的平台设置检查供应商的要求。

解决办法

语法错误有哪些?

PHP 属于 C-styleimperative 编程语言。它有严格的语法规则,当遇到错位的符号或标识符时,它无法恢复。它不能猜测你的编码意图。

最重要的提示

有一些基本的预防措施,你可以经常采取。

  • 使用适当的**代码缩进,或采用任何崇高的编码风格。 可读性防止不规范。

  • 使用一个IDE或PHP的编辑器,带有语法高亮。 这也有助于圆括号/括号的平衡。

  • 阅读语言参考和手册中的例子。 两次,以达到一定的熟练程度。

    如何解释解析器错误

    一个典型的语法错误信息是这样的

    解析错误: 语法错误, unexpected T_STRING, expecting ';' in file.php on line 217. 其中列出了一个语法错误的位置。请看提到的文件名行号。 一个monikerT_STRING解释了解析器/标记器最终不能处理的符号。不过,这不一定是语法错误的原因。 查看**之前的代码行也是很重要的。通常情况下,语法错误只是之前发生的误操作。错误行号只是解析器最终放弃处理的地方。

    解决语法错误

    有很多方法可以缩小和解决语法错误。

  • 打开提到的源文件。看一下提到的代码行

    • 对于失控的字符串和放错位置的运算符,这通常是你找到罪魁祸首的地方。
    • 从左到右阅读这一行,想象每个符号的作用。
  • 更经常的是,你还需要看一下的前几行

    • 特别是缺失的;分号在前面的行尾/语句中缺失。(至少从文体的角度看是这样。)
    • 如果{代码块}被不正确地封闭或嵌套,你可能需要在源代码上更进一步调查。使用适当的代码缩进来简化这个问题。
  • 看一下语法着色!

    • 字符串、变量和常量都应该有不同的颜色。
    • 操作符+-*/.也应该被染成不同的颜色。否则,它们可能会出现在错误的上下文中。
    • 如果你看到字符串着色延伸得太远或太短,那么你就发现了一个未转义的或丢失的结尾"'字符串标记。
    • 两个相同颜色的标点符号相邻,也可能意味着麻烦。通常情况下,如果不是 "++"、"--"或括号在运算符后面,运算符是孤独的。在大多数情况下,两个字符串/标识符直接在一起是不正确的。
  • 白色空间是你的朋友。 遵循**的编码风格。

  • 暂时拆分长行。

    • 你可以自由地**在运算符或常数和字符串之间添加换行符。然后,解析器会将行号具体化,以应对解析错误。与其看非常冗长的代码,你可以隔离出缺失或错位的语法符号。
    • 将复杂的 "if "语句拆分为不同的或嵌套的 "if "条件。
    • 不使用冗长的数学公式或逻辑链,而使用临时变量来简化代码。(更易读=更少的错误。)
    • 在以下内容之间添加换行符。 1.你可以很容易地识别为正确的代码。 2.你不确定的部分。 3.以及解析器抱怨的那几行。
      将长的代码块分割开来,**真正有助于找到语法错误的根源。
  • 注释出违规的代码。

    • 如果你不能分离出问题的源头,就开始注释(从而暂时删除)代码块。
    • 一旦你摆脱了解析错误,你就找到了问题的根源。再仔细看看那里。
    • 有时你想暂时删除完整的函数/方法块。(在不匹配的大括号和错误缩进的代码的情况下)。)
    • 当你不能解决语法问题时,试着重写被注释掉的部分,**从头开始。
  • 作为一个新手,要避免一些混乱的语法结构。

    • 三元的? :条件操作符可以压缩代码,确实很有用。但它并不是在所有情况下都有助于可读性。在不熟悉的情况下,更倾向于使用普通的if语句。
    • PHP的替代语法(if:/elseif:/endif;)在模板中很常见,但可以说不如正常的{代码``块容易掌握。
  • 新人最普遍的错误是。

    • 语句/行结束时缺少分号;
    • "'的字符串引号不匹配,以及内部未转录的引号。
    • 被遗忘的运算符,特别是字符串.的连接。
    • 不平衡的(括号)。在报告行中计算它们。它们的数量是否相等?
  • 不要忘记,解决了一个语法问题,就会发现下一个问题。

    • 如果你让一个问题消失了,但在下面的一些代码中又出现了其他的问题,那么你基本上是走对了路。
    • 如果在编辑之后,同一行中又出现了新的语法错误,那么你的尝试可能是失败的。(但不一定。)
  • 如果你不能修复它,请恢复以前工作的代码的备份。

    • 采用一个源代码版本系统。你可以随时查看损坏的版本和最后工作的版本的`diff'。这可能会对语法问题有所启发。
  • 不可见的杂散Unicode字符。在某些情况下,你需要使用hexeditor或不同的编辑器/查看器来查看你的源代码。有些问题不能仅仅通过查看你的代码来发现。

    • 试试grep -color -P -n "\[\x80-\xFF\]" file.php 作为查找非ASCII符号的第一项措施。
    • 特别是BOMs,零宽度的空格,或者非断裂的空格,以及智能引号经常会在源代码中找到它们。
  • 注意文件中保存的类型的换行符

    • PHP只接受n换行符,而不是r回车符。
    • 这对MacOS用户来说偶尔是个问题(甚至在OS  X上的错误配置的编辑器)。
    • 通常只有在使用单行//#注释时才会出现这个问题。多行/*...*/注释很少会干扰解析器,因为断行被忽略了。
  • 如果你的语法错误没有通过网络传输。 你的机器上有一个语法错误,这是正常的。但在网上发布相同的文件时,就不会再出现这种情况。这只能说明两件事中的一件。

    • 你看错了文件!
    • 或者你的代码中含有看不见的杂散的Unicode(见上文)。 你可以很容易地找到答案。只要把你的代码从网络表格中复制到你的文本编辑器中。
  • 检查你的PHP版本。不是所有的语法结构在每个服务器上都可用。

    • php -v用于命令行解释器
    • <?php phpinfo();用于通过webserver调用的那个。
      这些并不一定相同。特别是在与框架一起工作时,你将它们匹配起来。
  • 不要使用PHP的保留关键字作为函数/方法、类或常量的标识。

  • 试错法是你最后的手段。 如果所有的方法都失败了,你可以随时谷歌你的错误信息。语法符号不是那么容易搜索的(Stack Overflow本身是由SymbolHound索引的)。因此,你可能需要多看几页才能找到相关的东西。 更多的指南。

  • PHP 调试基础知识 作者:David Sklar

  • 修复PHP错误 作者:Jason McCreary

  • PHP错误 - 10个常见错误 作者:Mario Lurig

  • 常见的PHP错误和解决方案

  • 如何排除和修复您的WordPress网站的故障

  • 设计人员的PHP错误信息指南 - Smashing Magazine

    白屏死机

    如果你的网站只是空白,那么通常是语法错误造成的。 用以下方法启用它们的显示。

    • 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

评论(2)

##不料T_VARIABLE

一个 "意外的T_VARIABLE'"意味着有一个字面的$variable'名称,它不适合当前的表达式/语句结构。

1.

缺少分号

它最常见的是表示[前一行缺少分号](https://stackoverflow.com/questions/9135784/syntax-error-unexpected-t-variable)。语句后面的变量赋值是一个很好的指示器,可以在哪里查看。

           ⇓
    func1()
    $var = 1 + 2; # 第+2行的解析错误

2.

字符串连接法</h3

一个经常发生的错误是字符串连接被遗忘的.操作符。

                                   ⇓
    print "这里有一个值。" $value。

Btw,你应该更喜欢字符串插值(双引号中的基本变量),只要这有助于可读性。这就避免了这些语法问题。

字符串插值是脚本语言的核心功能。利用它并不丢人。忽略任何关于变量". "连接的微观优化建议是快的它不是

3.

缺少表达式操作符

当然,同样的问题也会出现在其他表达式中,例如算术运算。

               ⇓
    print 4 + 7 $var;

PHP不能*猜测*这里的变量是否应该被加、减或比较等等。

4.

列表</h3

语法列表也是如此,比如在数组人口中,解析器也会指示预期的逗号`,`,例如。

                                          ⇓
    $var = array("1" => $val, $val2, $val3 $val4)。

或者函数参数列表。

                                    ⇓
    函数 myfunc($param1, $param2 $param3, $param4)

同样,你是否在`list`或`global`语句中看到这种情况,或者在`for`循环中缺少`;`分号的时候。

5.

类的声明</h3

这个解析器错误也发生在[类声明中](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.h3标识符后的变量 /h3

你也不能让[变量跟在标识符后面](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 "的开头小括号。

iffor以及foreach语句。

           ⇓
    foreach $array as $key) {

解决方案:在语句和变量之间添加缺失的开头"("。
  1. Else不期望条件

         ⇓
    else ($var >= 0)

    解决方案。删除else中的条件或使用elseif

  2. 关闭时需要括号

         ⇓
    function() 使用$var {}

    解决方案。在"$var "周围添加括号。

10.

不可见的空白

正如[参考答案](https://stackoverflow.com/a/18050072/345031)中提到的 "不可见的游离Unicode"(如[非断裂空格](https://en.wikipedia.org/wiki/Non-breaking_space)),你可能也会看到这个错误,对于不怀好意的代码,如。

    <?php
                              ⇐
    $var = new PDO(...)。

这在文件的开头和复制粘贴的代码中相当普遍。如果你的代码在视觉上不包含语法问题,请用十六进制编辑器检查。

也见

评论(0)

不合预期的T_STRING

`T_STRING'是一个有点错误的名称.它并不是指一个带引号的 "字符串"。它意味着遇到了一个原始标识符。它的范围可以从 "空白 "字词到剩余的 "CONSTANT "或函数名,被遗忘的未加引号的字符串,或任何纯文本。 1.

错误引用的字符串

。 这种语法错误最常见于错误引用的字符串值,但是。任何未转义和游离的""或"'"引号将形成一个无效的表达。 ⇓ ⇓ echo "点击这里"。 语法高亮会使这种错误变得超级明显。重要的是要记住使用反斜线来转义双引号,或者单引号--这取决于哪种被用作[字符串包围][1]。

评论(0)