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

2022-08-30 05:47:43

每个人都会遇到语法错误。即使是有经验的程序员也会打错字。对于新手来说,这只是学习过程的一部分。但是,通常很容易解释错误消息,例如:

PHP 解析错误:语法错误,索引中出现意外的“{”.php第 20 行

意想不到的符号并不总是真正的罪魁祸首。但是行号给出了从哪里开始寻找的粗略想法。

始终查看代码上下文。语法错误通常隐藏在提到的代码行或前面的代码行中。将您的代码与手册中的语法示例进行比较。

虽然并非每个案例都与其他案例匹配。然而,有一些解决语法错误的一般步骤。该参考文献总结了常见的陷阱:

密切相关的参考资料:

和:

虽然Stack Overflow也欢迎新手程序员,但它主要针对专业的编程问题。

  • 回答每个人的编码错误和狭窄的拼写错误大多被认为是跑题的。
  • 因此,在发布语法修复请求之前,请花点时间遵循基本步骤
  • 如果您仍然需要,请展示您自己的解决计划,尝试的修复方法以及您对外观或可能错误的内容的思考过程。

如果您的浏览器显示错误消息,例如“SyntaxError:非法字符”,那么它实际上与无关,而是语法错误


供应商代码引发的语法错误:最后,请考虑语法错误不是通过编辑代码库引起的,而是在外部供应商包安装或升级之后引发的,则可能是由于 PHP 版本不兼容,因此请根据平台设置检查供应商的要求。


答案 1

语法错误是什么?

PHP属于C风格命令式编程语言。它具有严格的语法规则,当遇到放错位置的符号或标识符时,它无法从中恢复。它无法猜测您的编码意图。

Function definition syntax abstract

最重要的提示

您可以随时采取一些基本的预防措施:

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

  • IDE 或编辑器用于具有语法突出显示功能的 PHP。这也有助于括号/括号平衡。

    Expected: semicolon

  • 阅读手册中的语言参考和示例。两次,变得有些熟练。

如何解释解析器错误

典型的语法错误消息如下:

解析错误:语法错误,意外T_STRING,文件中的第 217 .php需要 ;

其中列出了语法错误的可能位置。请参阅提到的文件名行号

诸如 之类的名字对象解释了解析器/分词器最终无法处理的符号。但是,这并不一定是语法错误的原因。T_STRING

查看前面的代码行也很重要。通常,语法错误只是之前发生的事故。错误行号只是解析器最终放弃处理所有内容的地方。

解决语法错误

有许多方法可以缩小和修复语法打嗝。

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

    • 对于失控的字符串和放错位置的运算符,这通常是您找到罪魁祸首的地方。

    • 从左到右阅读该行,想象每个符号的作用。

  • 更经常地,您还需要查看前面的行

    • 特别是,在前一行末尾/语句处缺少分号。(至少从文体的角度来看。;

    • 如果代码块被错误地关闭或嵌套,您可能需要进一步调查源代码。使用适当的代码缩进来简化这一点。{}

  • 看看语法着色

    • 字符串、变量和常量都应具有不同的颜色。

    • 运算符也应着色。否则,它们可能处于错误的上下文中。+-*/.

    • 如果您看到字符串着色延伸得太远或太短,则您发现了未转义或缺少的结束或字符串标记。"'

    • 两个相同颜色的标点符号字符彼此相邻也可能意味着麻烦。通常,如果运算符后面不是 、 或括号,则运算符是孤独的。在大多数上下文中,紧跟在一起的两个字符串/标识符是不正确的。++--

  • 空格是你的朋友。遵循任何编码风格。

  • 暂时打破长队。

    • 您可以在运算符或常量和字符串之间自由添加换行符。然后,解析器将具体化用于解析错误的行号。无需查看非常长的代码,您可以隔离丢失或放错位置的语法符号。

    • 将复杂语句拆分为不同的或嵌套的条件。ifif

    • 不要使用冗长的数学公式或逻辑链,而是使用临时变量来简化代码。(可读性更强 = 错误更少。

    • 在以下位置添加换行符:

      1. 您可以轻松识别为正确的代码,
      2. 您不确定的部分,
      3. 以及解析器抱怨的行。

      对长代码块进行分区确实有助于找到语法错误的根源。

  • 注释掉违规代码。

    • 如果无法隔离问题源,请开始注释掉(从而暂时删除)代码块。

    • 一旦你摆脱了解析错误,你就找到了问题的根源。仔细观察那里。

    • 有时,您希望暂时删除完整的函数/方法块。(如果出现不匹配的大括号和错误缩进的代码。

    • 如果无法解决语法问题,请尝试从头开始重写注释掉的部分。

  • 作为新手,请避免一些令人困惑的语法构造。

    • 三元条件运算符可以压缩代码,并且确实很有用。但它并不能在所有情况下都有助于提高可读性。在不熟悉时更喜欢简单的陈述。? :if

    • PHP的替代语法(//)在模板中很常见,但可以说不如普通代码块容易遵循。if:elseif:endif;{}

  • 最常见的新人错误是:

    • 缺少用于终止语句/行的分号。;

    • 或 的字符串引号不匹配,以及其中未转义的引号。"'

    • 忘记的运算符,特别是对于字符串串联。.

    • 不平衡的括号 。在报告的行中计数它们。它们的数量是否相等?()

  • 不要忘记,解决一个语法问题可以发现下一个语法问题。

    • 如果你让一个问题消失了,但其他问题在下面的一些代码中突然出现,那么你基本上走在正确的道路上。

    • 如果编辑后在同一行中出现新的语法错误,则您尝试的更改可能是失败的。(但并非总是如此。

  • 还原以前工作代码的备份(如果无法修复)。

    • 采用源代码版本控制系统。您始终可以查看损坏的和最后一个工作版本的 a。这可能对语法问题有什么启发性。diff
  • 不可见的离群 Unicode 字符:在某些情况下,您需要在源代码上使用十六进制编辑器或其他编辑器/查看器。有些问题不能仅仅通过查看代码来发现。

  • 注意在文件中保存哪种类型的换行符

    • PHP 只是尊重换行符,而不是回车符。\n\r

    • 对于MacOS用户来说,这偶尔会出现问题(即使在OS X上对于配置错误的编辑器也是如此)。

    • 它通常仅在使用单行或注释时才显示为问题。当换行符被忽略时,多行注释很少会干扰解析器。//#/*...*/

  • 如果您的语法错误未通过 Web 传输:您的计算机上恰好存在语法错误。但是,在线发布完全相同的文件不再显示它。这只能表示以下两件事之一:

    • 您正在查看错误的文件!

    • 或者您的代码包含不可见的杂散 Unicode(见上文)。您可以轻松找到答案:只需将代码从Web表单复制回文本编辑器即可。

  • 检查您的 PHP 版本。并非所有语法构造在每台服务器上都可用。

    • php -v用于命令行解释器

    • <?php phpinfo();对于通过 Web 服务器调用的那个。


    这些不一定是一样的。特别是在使用框架时,您将它们匹配。

  • 不要使用PHP的保留关键字作为函数/方法,类或常量的标识符。

  • 试错法是你最后的手段。

如果所有其他方法都失败了,您可以随时谷歌您的错误消息。语法符号并不容易搜索(虽然Stack Overflow本身由SymbolHound索引)。因此,在找到相关内容之前,可能需要再看几页。

更多指南:

白屏死机

如果您的网站只是空白,那么通常语法错误是原因。通过以下方式启用其显示:

  • error_reporting = E_ALL
  • display_errors = 1

在你的php中.ini通常,或者通过.htaccess mod_php,甚至.ini使用FastCGI设置。

在损坏的脚本中启用它为时已晚,因为PHP甚至无法解释/运行第一行。一个快速的解决方法是制作一个包装器脚本,比如说:test.php

<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

然后通过访问此包装器脚本来调用失败的代码。

它还有助于启用PHP并查看Web服务器的错误.log当脚本崩溃时使用HTTP 500响应时。error_log


答案 2

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

使用语法检查 IDE 意味着:

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

优秀的IDE具有语法检查功能(所有这些都可用于Linux,Windows和Mac):

  1. 网豆 [免费]
  2. PHP风暴 [$199 美元]
  3. Eclipse with PHP Plugin [免费]
  4. Sublime [$80 USD] (主要是文本编辑器,但可以使用插件进行扩展,如PHP语法解析器)

推荐