php - PHP解析/语法错误;以及如何解决它们

标签 php parsing debugging syntax-error

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

PHP Parse error: syntax error, unexpected '{' in index.php on line 20


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

Always look at the code context. The syntax mistake often hides in the mentioned or in previous code lines. Compare your code against syntax examples from the manual.


虽然并非每种情况都匹配。但是还有一些general steps to solve syntax mistakes
这些引用文献总结了常见的陷阱:
  • 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 , (逗号)

  • Unpexected . (句号)

  • Unexpected ; (分号)
  • Unexpected * (星号)
  • Unexpected : (冒号)
  • Unexpected ':', expecting ',' or ')'
  • Unexpected & (通过引用传递时间)
  • Unexpected .

  • 密切相关的引用文献:
  • What does this error mean in PHP? (runtime errors)
  • Parse error: syntax error, unexpected T_XXX
  • Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE
  • Parse error: syntax error, unexpected T_VARIABLE

  • What does this symbol mean in PHP? (language tokens)
  • Those “” smart ‘’ quotes mean nothing to PHP

  • 和:
  • PHP manual on php.net及其各种language tokens
  • 或维基百科的syntax introduction on PHP
  • 当然,最后是我们的php tag-wiki

  • 尽管Stack Overflow也欢迎新手程序员,但它主要针对专业编程问题。
  • 回答每个人的编码错误和狭窄的打字错误通常被认为是题外话。
  • 因此,在发布语法修复请求之前,请花点时间遵循basic steps
  • 如果仍然需要,请显示您自己的解决方案,尝试的修复以及您对外观或错误的思考过程。

  • 如果您的浏览器显示诸如“SyntaxError:非法字符”之类的错误消息,则它实际上不是相关的,而是-syntax error

    在供应商代码上引发的语法错误:最后,请考虑如果语法错误不是由于编辑代码库而引起的,而是在外部供应商软件包安装或升级之后出现的,则可能是由于PHP版本不兼容所致,因此请对照供应商的要求进行检查。您的平台设置。

    最佳答案

    语法错误是什么?

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

    最重要的提示

    您可以始终采取一些基本的预防措施:

  • 使用正确的代码缩进,或采用任何高级编码样式。
    可读性可防止出现不合规定的情况。
  • 使用突出显示的语法的IDE or editor for PHP
    这也有助于括号/括号平衡。

  • 阅读手册中的the language reference和示例。
    两次,变得有些熟练。

  • 如何解释解析器错误

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

    Parse error: syntax error, unexpected T_STRING, expecting ';' in file.php on line 217



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

    诸如T_STRING之类的moniker解释了解析器/ token 最终无法处理的符号。但是,这不一定是语法错误的原因。

    同样重要的是,还要研究之前的代码行。通常,语法错误只是更早发生的不幸。错误行号正是解析器最终放弃处理所有错误的地方。

    解决语法错误

    有许多方法可以缩小和修复语法问题。
  • 打开提到的源文件。查看提到的代码行
  • 对于失控的字符串和错误放置的运算符,通常在这里找到罪魁祸首。
  • 从左到右阅读该行,并想象每个符号的作用。
  • 更经常地,您还需要在的前几行中查看
  • 特别是,缺少的;分号在前一行的末尾/语句中丢失了。 (至少从样式 Angular 而言。)
  • 如果{代码块}被错误地关闭或嵌套,则可能需要进一步研究源代码。使用适当的代码缩进可以简化该过程。
  • 查看语法着色!
  • 字符串,变量和常量都应具有不同的颜色。
  • 运算符+-*/.也应设置为不同的颜色。否则,它们可能处于错误的环境中。
  • 如果您看到字符串着色延伸得太远或太短,则您发现了未转义或丢失的结束"'字符串标记。
  • 彼此相邻的两个相同颜色的标点符号也可能会带来麻烦。通常,如果运算符不是++--或运算符后的括号,则运算符将是孤独的。在大多数情况下,紧随其后的两个字符串/标识符是错误的。
  • 空格是您的 friend
    遵循任何编码风格。
  • 暂时中断长行。
  • 您可以在运算符或常量和字符串之间自由地添加换行。然后,解析器将具体化行号以解析错误。您可以查看丢失或放错位置的语法符号,而不必查看冗长的代码。
  • 将复杂的if语句拆分为不同的或嵌套的if条件。
  • 使用临时变量来简化代码,而不必使用冗长的数学公式或逻辑链。 (更具可读性=更少错误。)
  • 在以下之间添加换行符:
  • 您可以轻松将其识别为正确的代码
  • 不确定的部分
  • 以及解析器抱怨的行。

  • 对长代码块进行分区确实有助于查找语法错误的来源。
  • 注释掉违规代码。
  • 如果您无法找出问题的根源,请开始注释掉(并因此暂时删除)代码块。
  • 摆脱了分析错误后,您便找到了问题根源。仔细看那里。
  • 有时您想暂时删除完整的功能/方法块。 (如果大括号不匹配且代码缩进不正确。)
  • 如果您无法解决语法问题,请尝试重写,从头开始注释掉的部分。
  • 作为新手,请避免使用一些令人困惑的语法构造。
  • 三元? :条件运算符可以压缩代码,并且确实有用。但这并不能在所有情况下都有助于可读性。最好不要使用普通的if语句。
  • PHP的替代语法(if:/elseif:/endif;)在模板中很常见,但可以说比一般的{代码}块不那么容易理解。
  • 最普遍的新人错误是:
  • 缺少用于终止语句/行的分号;
  • "'的字符串引号不匹配,并且其中的未转义引号。
  • 被遗忘的运算符,尤其是对于字符串.串联而言。
  • 不平衡的(括号)。在报告的行中计数它们。它们是否相等?
  • 不要忘记解决一个语法问题可以发现另一个语法问题。
  • 如果您解决了一个问题,但是在下面的一些代码中却发现了其他问题,那么您通常走在正确的道路上。
  • 如果在编辑新的语法错误后又出现在同一行中,则您尝试的更改可能是失败的。 (尽管不总是如此。)
  • 如果无法修复,请还原以前工作的代码的备份。
  • 采用源代码版本控制系统。您始终可以查看已损坏和最后可用版本的diff。关于语法问题,这可能很有启发性。
  • 不可见的杂散Unicode字符:在某些情况下,您需要在源上使用use a hexeditor或其他编辑器/查看器。仅通过查看代码就无法发现某些问题。
  • 尝试使用 grep --color -P -n "\[\x80-\xFF\]" file.php 作为查找非ASCII符号的第一种方法。
  • 特别是BOM,零宽度空格或不间断空格以及智能引号可以定期在源代码中找到。
  • 请注意在文件中保存了哪种类型的换行符
  • PHP仅兑现\ n换行符,而不兑现\ r回车符。
  • 这对于MacOS用户有时是个问题(即使在OS X上,对于配置错误的编辑器)。
  • 使用单行//#注释时,通常仅是一个问题。当换行符被忽略时,多行/*...*/注释很少会干扰解析器。
  • 如果您的语法错误未通过网络传输:
    碰巧您的计算机上存在语法错误。但是,将相同的文件在线发布不再显示。这仅意味着两件事之一:
  • 您看错文件了!
  • 或您的代码包含不可见的杂散Unicode(请参见上文)。
    您可以轻松地发现:只需将代码从Web表单复制回文本编辑器即可。
  • 检查您的 PHP版本。并非所有语法构造在每台服务器上都可用。

    命令行解释器
  • php -v
  • <?php phpinfo();用于通过Web服务器调用的代码。

  • 这些不一定相同。特别是在使用框架时,您将使它们匹配。
  • 不要将PHP's reserved keywords用作函数/方法,类或常量的标识符。
  • 试错是您的最后选择。

  • 如果所有其他方法均失败,则您始终可以 google 您的错误消息。语法符号并不是那么容易搜索(堆栈溢出本身由SymbolHound索引)。因此,在找到相关内容之前,可能需要翻阅几页。

    其他指南:
  • 由David Sklar创作的PHP Debugging Basics
  • Jason McCreary的
  • Fixing PHP Errors
  • Mario Lurig的PHP Errors – 10 Common Mistakes
  • Common PHP Errors and Solutions
  • How to Troubleshoot and Fix your WordPress Website
  • A Guide To PHP Error Messages For Designers-Smashing Magazine

  • 死亡白屏

    如果您的网站只是空白,则通常是语法错误。
    通过以下方式启用其显示:
  • error_reporting = E_ALL
  • display_errors = 1

  • 通常,在您的 php.ini 中,或通过 .htaccess (对于mod_php),
    甚至是FastCGI设置的 .user.ini

    在损坏的脚本中启用它为时已晚,因为PHP甚至无法解释/运行第一行。一个快速的解决方法是制作包装器脚本,例如test.php:
    <?php
       error_reporting(E_ALL);
       ini_set("display_errors", 1);
       include("./broken-script.php");
    

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

    它还有助于启用PHP的error_log并在脚本因HTTP 500响应而崩溃时查看webserver's error.log

    关于php - PHP解析/语法错误;以及如何解决它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63987069/

    相关文章:

    php - 将货币格式的字符串转换为 float

    PHP 回显一大块文本

    python - 在 python 中解析文本

    php - PHP解析/语法错误;以及如何解决它们

    .net - 是否有像 DbgCLR.exe 这样的工具可用于调试 .NET Framework 4.0 程序集

    c++ - 使用 Visual Studio 在发布二进制文件中生成符号

    php strpos 特殊字符

    PHP DateTime 明年第一天

    java - 正则表达式模式未获取匹配项

    java - JSON解析器推荐: Is there a JSON Parser which maintains order?