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 , 在发布语法修复请求之前。
  • 如果您仍然必须这样做,请展示您自己的解决方案、尝试的修复以及您对看起来或可能出错的思考过程。

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

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

    最佳答案

    什么是语法错误?

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

    Function definition syntax abstract

    最重要的提示

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

  • 正确使用 代码缩进 ,或采用任何高级编码风格。
    可读性可防止出现违规行为。
  • 使用 IDE or editor for PHP语法高亮 .
    这也有助于括号/括号平衡。

    Expected: semicolon
  • 阅读 the language reference和手册中的例子。
    两次,变得有些精通。

  • 如何解释解析器错误

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

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



    其中列出了语法错误的可能位置。见上述文件名 行号 .

    monikerT_STRING解释解析器/分词器最终无法处理的符号。然而,这不一定是语法错误的原因。

    查看 很重要以前的代码行 以及。通常语法错误只是之前发生的不幸。错误行号正是解析器最终放弃处理它的地方。

    解决语法错误

    有很多方法可以缩小和修复语法问题。
  • 打开提到的源文件。看看上面提到的代码行 .
  • 对于失控的字符串和错位的运算符,这通常是您找到罪魁祸首的地方。
  • 从左到右阅读这行并想象每个符号的作用。
  • 更经常地你需要看看前几行 以及。
  • 特别失踪;前一行结尾/语句中缺少分号。 (至少从文体的角度来看。)
  • {代码块}错误地关闭或嵌套,您可能需要进一步调查源代码。使用适当的代码缩进来简化它。
  • 语法着色 !
  • 字符串、变量和常量都应该有不同的颜色。
  • 运营商 +-*/.也应该着色不同。否则他们可能处于错误的上下文中。
  • 如果您看到字符串着色延伸得太远或太短,那么您发现了一个未转义或丢失的结尾 "'字符串标记。
  • 两个相同颜色的标点符号相邻也意味着麻烦。通常,如果不是 ++,运营商是孤独的, -- , 或运算符后面的括号。在大多数情况下,紧随其后的两个字符串/标识符是不正确的。
  • 空白是你的 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作为函数/方法、类或常量的标识符。
  • 反复试验是您的最后手段。

  • 如果所有其他方法都失败了,您可以随时 谷歌 你的错误信息。语法符号不是那么容易搜索(尽管堆栈溢出本身是由 SymbolHound 索引的)。因此,您可能需要多浏览几页才能找到相关内容。

    更多指南:
  • PHP Debugging Basics作者:David Sklar
  • 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 - 粉碎杂志

  • 白屏死机

    如果您的网站只是空白,那么通常是因为语法错误。
    启用他们的显示:
  • 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并查看您的 webserver's error.log 当脚本因 HTTP 500 响应而崩溃时。

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

    相关文章:

    PHP - 在整个应用程序中使类对象全局化?

    php - Left Join获取上一条记录sql

    php - xsl根据数值选择节点

    java - 连接 Java 字符串中的连续整数

    delphi - 在 Delphi 中解析一行的最快方法是什么?

    android - ADB 未检测到 Sony Xperia Z3 Compact (android 5.0.2)

    仅在某些手机上存在 Android 应用错误/错误

    Android USB 调试不显示授权对话框

    php - 生成数组所有版本的算法,可能的权重分配为 0-100

    php - 如何按照与 OR 语句相同的顺序排列 mysql 结果?