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

标签 php parsing debugging syntax-error

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

PHP解析错误:语法错误,第20行的index.php中出现意外的'{'

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

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

虽然并非每种情况都匹配。但是还有一些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 & (通过引用传递的通话时间)
  • 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
  • 或Wikipedia的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和示例。
    两次,变得有些熟练。

  • 如何解释解析器错误

    典型的语法错误消息为:

    解析错误:语法错误,意外的 T_STRING ,在 217上在file.php中期望';'

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

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

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

    解决语法错误

    有许多方法可以缩小和修复语法问题。
  • 打开提到的源文件。查看提到的代码行
  • 对于失控的字符串和放错位置的运算符,通常会在这里找到罪魁祸首。
  • 从左到右阅读该行,并想象每个符号的作用。
  • 更经常地,您还需要在的前几行中查看
  • 特别是,缺少的;分号在前一行的末尾/语句中丢失了。 (至少从样式角度而言。)
  • 如果{代码块}错误地关闭或嵌套,则可能需要进一步研究源代码。使用适当的代码缩进可以简化该过程。
  • 查看语法着色!
  • 字符串,变量和常量都应具有不同的颜色。
  • 运算符+-*/.也应设置为不同的颜色。否则,它们可能处于错误的环境中。
  • 如果您看到字符串着色延伸得太远或太短,则您发现了未转义或缺少的结束"'字符串标记。
  • 两个彼此相邻的相同颜色的标点符号也可能带来麻烦。通常,如果运算符不是++--或运算符后的括号,则运算符将是孤独的。在大多数情况下,紧随其后的两个字符串/标识符是错误的。
  • 空格是您的 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();

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

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

    其他指南:
  • 由David Sklar创作的PHP Debugging Basics
  • Jason McCreary的
  • Fixing PHP Errors
  • PHP Errors – 10 Common Mistakes由Mario Lurig
  • 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/51698746/

    相关文章:

    phpseclib:使用证书验证签名数据

    javascript/jquery 抓取部分 URL

    python - 使用 Python 2.7 解析 HTML - HTMLParser、SGMLParser 或 Beautiful Soup?

    c++ - addr2line 获取行号总是返回 0

    c++ - Apache Thrift 未定义对生成代码中 vtable 的引用

    javascript - 为什么我无法使用 Chrome 查看/调试加载了 jquery.html() 的 javascript

    php - 在 Woocommerce 中的 functions.php 文件中显示添加到购物车按钮的价格

    php - 如何从mysql读取和写入数据到JSON,然后用于谷歌表格图表

    php - 在 Laravel 5 中显示本地磁盘中的 pdf 文件?

    python - 无法在字符串中找到字符?