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

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

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

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

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

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

  • 意外的T_STRING

  • 意外的T_VARIABLE
    意外的'$ varname'(T_VARIABLE)

  • 意外的T_CONSTANT_ENCAPSED_STRING
    意外的T_ENCAPSED_AND_WHITESPACE

  • 意外的$结束

  • 意外的T_FUNCTION ...

  • 意外的{

  • 意外的}

  • 意外的(

  • 意外)

  • 意想不到的[

  • 意外]

  • 意外的T_IF
    意外的T_FOREACH
    意外的T_FOR
    意外的T_WHILE
    意外的T_DO
    意外的T_PRINT
    意外的T_ECHO

  • 意外的T_LNUMBER

  • 意外的T_INLINE_HTML ...

  • 意外的T_PAAMAYIM_NEKUDOTAYIM ...

  • 意外的T_OBJECT_OPERATOR ...

  • 意外的T_DOUBLE_ARROW ...

  • 意外的T_SL ...

  • 意外的T_BOOLEAN_OR ...
    意外的T_BOOLEAN_AND ...

  • 意外的T_IS_EQUAL
    意外的T_IS_GREATER_OR_EQUAL
    意外的T_IS_IDENTICAL
    意外的T_IS_NOT_EQUAL
    意外的T_IS_NOT_IDENTICAL
    意外的T_IS_SMALLER_OR_EQUAL
    意想不到的<
    意外>

  • 意外的T_NS_SEPARATOR ...

  • 输入中意外的字符:' '(ASCII = 92)状态= 1

  • 意外的'公共'(T_PUBLIC)
    意外的'私人'(T_PRIVATE)
    意外的'保护'(T_PROTECTED)
    意想不到的'final'(T_FINAL)...

  • 意外的T_STATIC ...

  • 意外的T_CLASS ...

  • 意外的T_DNUMBER

  • 意外, (逗号)

  • 没有限制. (期)

  • 意想不到的; (分号)

  • 意外* (星号)

  • 意外:冒号)

  • 密切相关的参考文献:

  • 这个错误在PHP中意味着什么? (运行时错误)
  • 解析错误:语法错误,意外的T_XXX
  • 解析错误:语法错误,意外的T_ENCAPSED_AND_WHITESPACE
  • 解析错误:语法错误,意外的T_VARIABLE
  • 这个符号在PHP中意味着什么? (语言令牌)
  • 这些“”聪明''引号对PHP没有任何意义
  • 和:

  • php.net上的PHP手册及其各种语言标记
  • 或者维基百科关于PHP的语法介绍。
  • 最后,我们的PHP标签维基当然。
  • 虽然Stack Overflow也欢迎新秀编码器,但它主要针对专业编程问题。

  • 回答每个人的编码错误和狭隘的错别字大多被认为是无关紧要的。
  • 因此,请在发布语法修复请求之前花时间遵循基本步骤。
  • 如果您仍然需要,请展示您自己的解决方案,尝试修复和思考过程,看看或可能会出错。
  • 如果您的浏览器显示诸如“SyntaxError:非法字符”之类的错误消息,那么它实际上并不是php相关的,而是一个JavaScript语法错误。


    什么是语法错误?

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

    最重要的提示

    您可以采取以下几项基本预防措施:

  • 使用正确的代码缩进 ,或采用任何崇高的编码风格。 可读性防止违规行为。

  • 使用语法高亮显示的 PHP或IDE编辑器。 这也有助于括号/括号平衡。

  • 阅读手册中的语言参考和示例。 两次,变得有点精通。

  • 如何解析分析器错误

    一个典型的语法错误信息如下:

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

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

    T_STRINGT_STRING解释了解析器/标记器最终无法处理的符号。 但这不一定是语法错误的原因。

    查看以前的代码行也很重要。 语法错误常常是早期发生的事故。 错误行号就是解析器决定放弃处理这一切的地方。

    解决语法错误

    有很多方法可以缩小和修复语法问题。

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

  • 对于失控的琴弦和错位的操作员,这通常是你找到罪魁祸首的地方。

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

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

  • 特别是失踪; 分号在前一行结束/语句中丢失。 (至少从文体的角度来看)。

  • 如果{代码块}错误地关闭或嵌套,则可能需要进一步调查源代码。 使用正确的代码缩进来简化。

  • 看看语法着色

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

  • 运营商+-*/. 也应该有不同的颜色。 否则他们可能会处于错误的环境中。

  • 如果您看到字符串着色延伸得太远或太短,那么您发现了一个未转义或缺失的"'字符串标记。

  • 让两个相同颜色的标点符号相邻也意味着麻烦。 通常,如果操作符不是++--或括号,运算符就是孤立的。 在大多数情况下,直接跟在彼此之后的两个字符串/标识符不正确。

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

  • 暂时分解长线。

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

  • 分手复杂if语句转换成不同的或嵌套if条件。

  • 代替冗长的数学公式或逻辑链,使用临时变量来简化代码。 (更易读=错误更少)

  • 添加换行符:

  • 代码你可以很容易地识别为正确的,
  • 你不确定的部分,
  • 解析器抱怨的线条。
  • 分割长代码块确实有助于查找语法错误的来源。

  • 评论违规代码。

  • 如果您无法隔离问题来源,请开始注释(并暂时移除)代码块。

  • 只要你摆脱了解析错误,你已经找到了问题的来源。 仔细看看。

  • 有时候你想暂时删除完整的函数/方法块。 (如果使用不匹配的花括号和错误缩进的代码)。

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

  • 作为一个新手,避免一些混淆的语法结构。

  • 三元? : ? :条件运算符可以压缩代码并确实有用。 但它在任何情况下都无助于可读性。 优先使用普通的if语句而不使用。

  • PHP的替代语法( if: / elseif: / endif; )对于模板很常见,但可以说比普通的{ code }块更容易遵循。

  • 最流行的新手错误是:

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

  • 不匹配的字符串引号中的"'和未转义的引号。

  • 被遗忘的操作员,特别是字符串. 级联。

  • 不平衡(括号) 。 在报告的行中对它们进行计数。 他们有相同数量吗?

  • 不要忘记解决一个语法问题可以揭示下一个语法问题。

  • 如果你让一个问题消失,但另一个问题在下面的某个代码中出现,那么你主要是在正确的道路上。

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

  • 如果无法解决问题,请恢复以前工作的代码的备份。

  • 采用源代码版本管理系统。 您始终可以查看已损坏和最后一个工作版本的diff 。 对于语法问题,这可能是有启发性的。
  • 不可见的流浪Unicode字符 :在某些情况下,您需要在源代码中使用hexeditor或不同的编辑器/查看器。 仅仅通过查看代码就无法发现一些问题。

  • 尝试使用grep --color -P -n "[x80-xFF]" file.php作为查找非ASCII符号的第一项措施。

  • 特别是物料清单,零宽度空间或不间断空格以及定期的智能报价可以找到源代码。

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

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

  • MacOS用户偶尔会遇到这个问题(即使是在OS X上配置错误的编辑器)。

  • 当使用单行//#注释时,它通常只是一个问题。 当换行符被忽略时,多行/*...*/注释很少干扰解析器。

  • 如果你的语法错误不能通过网络传输 :恰巧你的机器上有语法错误。 但在线发布相同的文件不会再显示。 这只能意味着两件事之一:

  • 你正在看错文件!

  • 或者你的代码包含不可见的流浪Unicode(见上文)。 您可以轻松发现:只需将您的代码从Web表单中复制到文本编辑器即可。

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

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

  • 反复试验是你的最后手段。

  • 如果一切都失败了,你可以随时谷歌你的错误信息。 语法符号不易搜索(Stack Overflow本身虽然由SymbolHound索引)。 因此,在查找相关内容之前,可能需要查看更多页面。

    其他指南:

  • PHP调试基础由David Sklar提供
  • 修复Jason McCreary的PHP错误
  • PHP错误 - Mario Lurig的10个常见错误
  • 常见的PHP错误和解决方案
  • 如何解决和修复您的WordPress网站
  • PHP设计师错误信息指南 - Smashing杂志
  • 死亡的白色屏幕

    如果您的网站只是空白,那么通常语法错误是原因。 启用它们的显示:

  • error_reporting = E_ALL
  • display_errors = 1
  • 通常在你的php.ini ,或者通过mod_php的.htaccess ,或者甚至.user.ini使用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响应脚本崩溃时查看Web服务器的error.log


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

    使用语法检查IDE意味着:

    你将(有效地)再也不会遇到语法错误,只是因为你在输入时看到它们是正确的。 认真。

    具有语法检查功能的优秀IDE(全部可用于Linux,Windows和Mac):

  • NetBeans [免费]
  • PHPStorm [199美元]
  • Eclipse与PHP插件[免费]
  • 崇高[80美元](主要是文本编辑器,但可以使用插件进行扩展,如PHP语法分析器)

  • 意想不到的[

    这些天,意想不到的[数组括号通常出现在过时的PHP版本上。 从PHP > = 5.4开始,可以使用短阵列语法。 旧的安装只支持array()

    $php53 = array(1, 2, 3);
    $php54 = [1, 2, 3];
             ⇑
    

    对于旧的PHP版本,数组函数结果解引用同样不可用:

    $result = get_whatever()["key"];
                          ⇑
    

    参考 - 这个错误在PHP中意味着什么? - “语法错误,意外的[ ”显示最常见和实用的解决方法。

    尽管如此,您只需升级PHP安装即可。 对于共享SetHandler php56-fcgi主机计划,首先研究如果SetHandler php56-fcgi可用于启用更新的运行时。

    也可以看看:

  • 取消引用函数结果的PHP语法→自PHP 5.4起可能
  • PHP语法错误,意外的'['
  • 数组的简写:是否有像{}或[]这样的字面语法?
  • PHP 5.3.10 vs PHP 5.5.3语法错误意外'''
  • 数组之间的差异()和[]
  • PHP数组语法分析错误左方括号“[”
  • 顺便说一句,如果你对老版本+较慢的PHP版本非常抱歉,还有预处理器和PHP 5.4语法下变换器。

    意外的其他原因[语法错误

    如果不是PHP版本不匹配,那么它通常是一个普通的错字或新手语法错误:

  • 你不能在类中使用数组属性声明/表达式,即使在PHP 7中也是如此。

    protected $var["x"] = "Nope";
                  ⇑
    
  • 混淆[开放花括号{或括号(是一种常见的疏忽)。

    foreach [$a as $b)
            ⇑
    

    甚至:

    function foobar[$a, $b, $c] {
                   ⇑
    
  • 或者试图将常量(PHP 5.6之前)解引用为数组:

    $var = const[123];
           ⇑
    

    至少PHP将该const解释为常量名称。

    如果您打算访问数组变量(这是此处的典型原因),那么添加前导$ sigil - 因此它变成$varname


  • 意外]关闭方括号

    这是比较罕见的,但也有句法意外的终止数组]括号。

  • 与错配再次)圆括号或}大括号是常见的:

    function foobar($a, $b, $c] {
                              ⇑
    
  • 或者试图结束一个没有一个数组的地方:

    $var = 2];
    

    在多行和嵌套数组声明中经常发生这种情况。

    $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
                                                 ⇑
    

    如果是的话,用你的IDE括号匹配找到任何过早]阵列关闭。 至少使用更多的间距和换行符来缩小它的范围。

  • 链接地址: http://www.djcxy.com/p/1873.html

    上一篇: PHP parse/syntax errors; and how to solve them?

    下一篇: What does this error mean in PHP?