关于解析:PHP解析/语法错误;如何解决它们?

PHP parse/syntax errors; and how to solve them?

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

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.

但并非每一种情况都符合另一种情况。然而,有一些通用的步骤来解决语法错误。这些参考总结了常见的缺陷:

  • 意外的T_字符串

  • 意外的t_变量意外的"$varname"(t_变量)

  • 意外的t_常量已封装字符串意外的t_已封装和空白

  • 意外的美元

  • 意外的tu函数…

  • 意外的{意外的}意外的(意外的)

  • 意外的[意外的]

  • 意外的T_如果意外的T_foreach意外的T_对于意外的T_而意外的T_做意外的T_打印意外的T_回声

  • 意外的数字

  • 出乎意料?

  • 意外继续(t_continue)意外继续(t_break)意外继续(t_return)

  • 意想不到的"="

  • 意外的t_inline_html…

  • 意想不到的T·帕玛伊姆·内库多塔伊姆…

  • 意外的t对象运算符…

  • 意外的双箭头…

  • 意想不到的Tu sl…

  • 意外的T布尔值或…意外的T布尔值和…

  • 意外的t_等于意外的t_大于或等于意外的t_相同意外的t不等于意外的t_不相同意外的t_小于或等于意外的<。意外的>

  • 意外的分隔符…

  • 输入中出现意外字符:"\"(ascii=92)状态=1

  • 意外的"public"(t_public)意外的"private"(t_private)意外的"protected"(t_protected)意外的"final"(t_final)…

  • 意外的静态…

  • 意外的Tu类…

  • 意外的数字

  • 意外的,(逗号)

  • 未执行.

  • 意外的;(分号)

  • 意外的*(星号)

  • 意外的:(冒号)

密切相关的参考文献:

  • 这个错误在PHP中意味着什么?(运行时错误)
    • 分析错误:语法错误,意外的t_xxx
    • 分析错误:语法错误,意外的t_和u空白
    • 分析错误:语法错误,意外的t_变量
  • 这个符号在PHP中意味着什么?(语言标记)
  • 这些""智能‘’引号对php没有任何意义。

还有:

  • php.net上的php手册及其各种语言标记
  • 或者维基百科的PHP语法介绍。
  • 最后一个是我们的php标签wiki。

虽然堆栈溢出也欢迎新手编码人员,但它主要针对专业编程问题。

  • 回答每个人的编码错误和狭窄的打字错误通常被认为是离题的。
  • 因此,在发布语法修复请求之前,请花时间遵循基本步骤。
  • 如果你还必须这样做,请展示你自己的解决方案,尝试的修复,以及你的思考过程,看什么是看起来或可能是错误的。

如果浏览器显示错误消息,如"syntax error:非法字符",那么它实际上与PHP无关,而是一个javascript语法错误。

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


什么是语法错误?

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

Function definition syntax abstract好的。最重要的提示

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

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

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

    Expected: semicolon好的。

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

如何解释分析器错误

典型的语法错误消息为:好的。

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

Ok.

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

T_STRING这样的绰号解释了解析器/标记器最终无法处理的符号。然而,这不一定是导致语法错误的原因。好的。

查看以前的代码行也很重要。通常,语法错误只是之前发生的意外。错误行号就是解析器最终放弃处理所有错误的地方。好的。解决语法错误

有许多方法可以缩小范围并解决语法问题。好的。

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

    • 对于失控的字符串和错位的运算符,这通常是您找到罪犯的地方。好的。

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

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

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

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

  • 看看语法着色!好的。

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

    • 操作工+-*/.也应着色清楚。否则,他们可能处于错误的环境中。好的。

    • 如果看到字符串颜色化扩展得太远或太短,则会发现一个未捕获或丢失的结束"'字符串标记。好的。

    • 相邻有两个相同颜色的标点符号也会带来麻烦。通常,如果不是++--或运算符后面的括号,则运算符是单独的。在大多数上下文中,直接跟在后面的两个字符串/标识符是不正确的。好的。

  • 空白区是你的朋友。遵循任何编码样式。好的。

  • 暂时分开长队。好的。

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

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

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

    • 在以下值之间添加换行符:好的。

    • 您可以轻松识别为正确的代码,
    • 你不确定的部分,
    • 以及解析器抱怨的行。< BR>
    • 对长代码块进行分区确实有助于找到语法错误的根源。好的。

  • 注释掉有问题的代码。好的。

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

    • 一旦排除了解析错误,就发现了问题源。仔细看。好的。

    • 有时您希望临时删除完整的函数/方法块。(以防不匹配的大括号和错误缩进的代码。)好的。

    • 当您无法解决语法问题时,请尝试从头重写注释掉的部分。好的。

  • 作为新来者,请避免一些混淆的语法结构。好的。

    • 三元? :条件运算符可以压缩代码,确实有用。但在所有情况下,它并不能帮助可读性。宁可用普通的if语句,也不可译。好的。

    • php的可选语法(if:/elseif:/endif;对于模板来说很常见,但可以说比普通的{代码}块更不容易遵循。好的。

  • 最常见的新来者错误是:好的。

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

    • "'的字符串引号不匹配,且内有未转义的引号。好的。

    • 忘记了运算符,特别是字符串.连接。好的。

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

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

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

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

  • 如果无法修复以前工作的代码,请还原其备份。好的。

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

    • 尝试使用grep --color -P -n"\[\x80-\xFF\]" file.php作为第一个找到非ASCII符号的度量。好的。

    • 尤其是BOM、零宽度空格或不间断空格和智能引号可以定期找到它们进入源代码的方式。好的。

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

    • php只支持akbd换行,而不是
      akbd回车。好的。

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

    • 它通常只在使用单行//#注释时作为问题出现。当换行符被忽略时,多行/*...*/注释很少会干扰解析器。好的。

  • 如果您的语法错误没有通过网络传输:您的机器上出现语法错误。但是在网上发布同样的文件已经不再显示它了。这只能意味着两件事之一:好的。

    • 你看错文件了!好的。

    • 或者您的代码包含不可见的游离Unicode(见上文)。您可以很容易地发现:只需将代码从Web表单复制回文本编辑器。好的。

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

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

    • ,用于通过Web服务器调用的。好的。

    这些不一定是一样的。尤其是在使用框架时,您会将它们匹配起来。好的。

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

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

如果所有其他都失败了,你可以在谷歌上搜索你的错误信息。语法符号并不容易搜索(不过堆栈溢出本身是由symbolhound索引的)。因此,在找到相关内容之前,可能需要再看几页。好的。

进一步指南:好的。

  • David Sklar的PHP调试基础知识
  • Jason McCreary修复PHP错误
  • PHP错误–Mario Lurig的10个常见错误
  • 常见的PHP错误和解决方案
  • 如何排除和修复WordPress网站
  • 设计人员PHP错误消息指南-粉碎杂志

死亡的白屏

如果您的网站只是空白的,那么通常是语法错误造成的。使用以下选项启用其显示:好的。

  • error_reporting = E_ALL
  • display_errors = 1

一般来说,在您的php.ini中,或通过.htaccess用于mod_php,甚至是带有fastcgi设置的.user.ini。好的。

在中断的脚本中启用它太晚了,因为PHP甚至无法解释/运行第一行。一个快速的解决方法是创建一个包装脚本,比如test.php:好的。

1
2
3
4
<?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):

  • NETBeBe[免费]
  • phpstorm[199美元]
  • 带PHP插件的Eclipse[free]
  • Sublime(80美元)(主要是一个文本编辑器,但可以用插件扩展,如PHP语法分析器)

  • 意外的[

    现在,在过时的PHP版本中,通常会看到意外的[数组括号。由于php>=5.4,因此短数组语法可用。较旧的安装仅支持array()

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

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

    1
    2
    $result = get_whatever()["key"];
                          ?

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

    不过,只需升级php安装就可以了。对于共享的网络托管计划,如果可以使用SetHandler php56-fcgi来启用较新的运行时,则应首先进行研究。

    参见:

    • 函数结果解引用的php语法→从php 5.4开始可能
    • PHP语法错误,意外的"["
    • 数组的简写:是否有像或[]这样的字面语法?
    • php 5.3.10 vs php 5.5.3语法错误意外"["
    • 数组()和[]之间的php差异
    • PHP数组语法分析错误左方括号"["

    顺便说一句,如果你真的对老版本和慢版本的PHP抱有兴趣的话,还有预处理器和PHP5.4语法向下转换器。

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

    如果不是PHP版本不匹配,那么通常是一个简单的拼写错误或新用户语法错误:

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

      1
      2
      protected $var["x"] ="Nope";
                    ?
    • [与大括号{或括号(混淆是一个常见的疏忽。

      1
      2
      foreach [$a as $b)
              ?

      甚至:

      1
      2
      function foobar[$a, $b, $c] {
                     ?
    • 或者尝试将常量(php 5.6之前)取消引用为数组:

      1
      2
      $var = const[123];
             ?

      至少php将const解释为一个常量名。

      如果要访问数组变量(这是这里的典型原因),则添加前导的$sigil,使其成为$varname

    • 您试图在关联数组的成员上使用global关键字。这不是有效的语法:

      1
      global $var['key'];

    < BR>

    意外的]右方括号

    这是比较少见的,但是终止数组]括号也有语法错误。

    • 同样,与)括号或}花括号不匹配是常见的:

      1
      2
      function foobar($a, $b, $c] {
                                ?
    • 或者尝试在没有数组的情况下结束数组:

      1
      $var = 2];

      通常出现在多行和嵌套数组声明中。

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

      如果是这样,请使用您的IDE进行括号匹配,以查找任何过早的]数组关闭。至少要使用更多的间距和换行符来缩小范围。


    意外的t_变量

    "意外的T_VARIABLE表示有一个文本$variable名称,它不适合当前的表达式/语句结构。

    purposefully abstract/inexact operator+$variable diagram

  • 缺少分号

    它通常表示前一行中缺少分号。语句后面的变量赋值是一个很好的指示器,可以在其中查找:

    1
    2
    3
           ?
    func1()
    $var = 1 + 2;     # parse error in line +2
  • 字符串连接

    一个常见的错误是字符串与遗忘的.运算符的串联:

    1
    2
                                   ?
    print"Here comes the value:"  $value;

    顺便说一句,你应该喜欢字符串插值(双引号中的基本变量),只要这有助于可读性。这样就避免了这些语法问题。

    String interpolation is a scripting language core feature. No shame in utilizing it. Ignore any micro-optimization advise about variable . concatenation being faster. It's not.

  • 缺少表达式运算符

    当然,同样的问题也可能出现在其他表达式中,例如算术运算:

    1
    2
               ?
    print 4 + 7 $var;

    这里PHP无法猜测是否应该添加、减去或比较变量等。

  • 列表

    与数组填充中的语法列表相同,其中解析器还指示预期的逗号,,例如:

    1
    2
                                          ?
    $var = array("1" => $val, $val2, $val3 $val4);

    或函数参数列表:

    1
    2
                                    ?
    function myfunc($param1, $param2 $param3, $param4)

    同样地,您是否在listglobal语句中看到这种情况,或者在for循环中缺少;分号时看到这种情况。

  • 类声明

    这个解析器错误也发生在类声明中。只能分配静态常量,不能分配表达式。因此,解析器将变量作为分配的数据来抱怨:

    1
    2
    class xyz {      ?
        var $value = $_GET["input"];

    不匹配的}闭合花括号尤其可以在这里引出。如果方法过早终止(请使用适当的缩进!)则通常会将一个零散变量放错在类声明体中。

  • 标识符后的变量

    也不能让变量直接跟在标识符后面:

    1
    2
                 ?
    $this->myFunc$VAR();

    顺便说一句,这是一个常见的例子,目的可能是使用变量。在这种情况下,例如使用$this->{"myFunc$VAR"}();进行变量属性查找。

    Take in mind that using variable variables should be the exception. Newcomers often try to use them too casually, even when arrays would be simpler and more appropriate.

  • 语言构造后缺少parens

    草率的打字可能会导致忘记左括号对于ifforforeach报表:

    1
    2
           ?
    foreach $array as $key) {

    解决方案:在语句和变量之间添加缺少的opening (

  • 否则不期望条件
    1
    2
         ?
    else ($var >= 0)

    解决方案:取消else的条件或使用elseif

  • 需要支架封闭
    1
    2
         ?
    function() uses $var {}

    解决方案:在$var周围加括号。

  • 不可见空白

    如"不可见的游离Unicode"(如不间断空格)的参考答案中所述,您可能还会看到此错误,因为不可靠的代码如下:

    1
    2
    3
    <?php
                              ?
    $var = new PDO(...);

    它在文件开头以及复制和粘贴代码中相当普遍。如果代码在视觉上不包含语法问题,请使用十六进制编辑器进行检查。

  • 也见

    • 搜索:意外的t_变量

    不期望的T ^ U常数封装^ U弦不期望的T ^ U封装和U ^ Whitespace

    不受欢迎的名字叫T_CONSTANT_ENCAPSED_STRINGT_ENCAPSED_AND_WHITESPACERefer to quoted "string"

    它们在不同的背景下使用,但语法问题是相似的。在双Quoted String context,while t 恒定…弦在php表达式或声明中通常是Astray。

  • 不正确的可变内插

    而且,它经常出现不正确的php变量内插法:

    1
    2
                              ?     ?
    echo"Here comes a $wrong['array'] access";

    Quoting arrays keys is a must in PHP context.但在双重弦乐(或遗产)中,这是一个错误。帕瑟抱怨说,单个集装箱是'string'的,因为这通常是一个文学标识/钥匙在那里。

    更精确地使用PHP2-style simple syntax within double contributions for array references:

    ZZU1

    Nested arrays or deeper object references however require the complex curly string expression syntax:

    1
    echo"Use {$array['as_usual']} with curly syntax.";

    如果不确定,这很安全。即使考虑得更多而且,最好是实际使用不同的句法着色。

  • 错综复杂

    如果一个字符串跟随一个表情,但缺少一个结构化或其他操作员,那么你会看到PHP complain about the string literal:

    1
    2
                           ?
    print"Hello" . WORLD " !";

    Php just can't guess the string was meant to be appened there.

  • 混淆弦

    当混淆弦乐划分器时,同样的语法错误出现。一条由单一的'或双重的"开始的弦乐,也以同样的方式结束。

    1
    2
    3
                    ?
    print"click here";
          ????????????????????????????????????????

    以双重摊款为例。但双重分摊也被指定用于HTML属性。然而,在单一摊款中作为第二条弦的一部分被解释为共有的运算符。

    Tip: Set your editor/IDE to use slightly distinct colorization for single and double quoted strings. (It also helps with application logic to prefer e.g. double quoted strings for textual output, and single quoted strings only for constant-like values.)

    这是一个很好的例子,说明你在第一个位置不应打破双重摊款。Instead just use proper \"

    1
    print"click here";

    当这也能引导语法混淆时,所有更好的编辑/编辑都能通过将离散配额染色而得到帮助。

  • 错失开价

    等价地被遗忘了打开"/'

    1
    2
                   ?
     make_url(login', 'open');

    在一个字母缩写后,当Obviously login时,会成为一个字符串。

  • 阵列列表

    如果你错过了一个,,就像在一个阵列创作块,帕瑟会看到两条消费者弦乐:

    1
    2
    3
    4
    array(               ?
        "key" =>"value"
        "next" =>"....",
    );

    注意到最后一条线可能总是含有一个额外的comma,但在两条线之间的一条线是不可原谅的。没有高清语法,很难发现。

  • 函数参数列表

    SAME thing for function calls:

    1
    2
                             ?
    myfunc(123,"text","and" "more")
  • 鲁纳韦弦乐

    一个常见的变异是简单地忘记了弦乐终结者:

    1
    2
    3
    4
                                    ?
    mysql_evil("SELECT * FROM stuffs);
    print"
    'ok'";
          ?

    这是PHP投诉两条弦乐文学直接跟随彼此。但真正的原因是未知的前奏。

  • See also

    • 相联阵列内插法
    • PHP-Syntax Error,unexpected t n封装字符串
    • 语法误差,不期望恒定 xE4包封在php
    • 在SQL查询中不期望的T U常数封装 U条纹误差

    意外的T_字符串

    T_STRING有点用词不当。它不指引用的"string"。这意味着遇到了原始标识符。这可以是从bare字到剩余的CONSTANT或函数名、被遗忘的无引号字符串或任何纯文本。好的。

  • 错误引用的字符串

    但是,这种语法错误最常见于错误引用的字符串值。任何未转义和离群的"'引语将构成无效的表达式:好的。

    1
    2
                   ?                  ?
     echo"click here";

    语法突出显示会使这种错误非常明显。记住使用反斜杠转义\"双引号或\'单引号是很重要的,这取决于哪个引号用作字符串附件。好的。

    • 为了方便起见,在输出包含双引号的纯HTML时,您应该首选外部单引号。
    • 如果要插入变量,请使用双引号字符串,但要注意转义文字"双引号。
    • 对于较长的输出,更倾向于使用多条echoprint线路,而不是进出。最好还是考虑一下Heredoc部分。

    另请参见PHP中单引号和双引号字符串的区别是什么?.好的。

  • 未闭合字符串

    如果您错过了一个结束的",那么一个语法错误通常会在稍后出现。在下一个预期的字符串值之前,未终止的字符串通常会消耗一点代码:好的。

    1
    2
    3
    4
                                                           ?
    echo"Some text", $a_variable,"and some runaway string ;
    success("
    finished");
             ?

    解析器可能会抗议的不仅仅是文字T_STRING。另一种常见的变化是用于不带引号的文本HTML的Unexpected '>'。好的。

  • 非编程字符串引号

    如果您从博客或网站复制和粘贴代码,有时会导致代码无效。字体引号不是PHP期望的:好的。

    1
    $text = ’Something something..+"these ain't quotes";

    排版/智能引号是Unicode符号。PHP将它们视为相邻字母数字文本的一部分。例如,"these被解释为常量标识符。但随后的任何文本文本文本被解析器视为一个空字/t_字符串。好的。

  • 丢失的分号;再次

    如果在前面的行中有一个未终止的表达式,那么下面的任何语句或语言构造都将被视为原始标识符:好的。

    1
    2
    3
           ?
    func1()
    function2();

    PHP只是不知道您是打算一个接一个地运行两个函数,还是打算将它们的结果相乘、相加、比较,或者只运行一个||或另一个。好的。

  • PHP脚本中的短开放标记和

    这是相当罕见的。但是,如果启用了short-open标记,那么就不能用XML声明开始PHP脚本:好的。

    1
    2
          ?
    <?xml version="1.0"?>

    PHP将看到,并自行回收。它不明白迷路的xml是什么意思。它将被解释为常量。但是,version将被视为另一个文字/常量。由于没有表达式操作符,解析器无法理解后面的两个文本/值,这将是一个解析器失败。好的。

  • 不可见的Unicode字符

    语法错误最可怕的原因是Unicode符号,例如不间断空格。PHP允许使用Unicode字符作为标识符名称。如果您收到一个T_字符串解析器对完全不可靠的代码的投诉,例如:好的。

    1
    2
    <?php
        print 123;

    您需要弹出另一个文本编辑器。甚至是一个十六进制编辑器。这里看起来像普通空格和换行符的内容可能包含不可见的常量。基于Java的IDE有时会忽略UTF-8 BOM中的内、零宽度空间、段落分隔符等。尝试重新编辑所有内容,删除空白并添加正常空间。好的。

    您可以通过在每行开始处添加冗余的;语句分隔符来缩小范围:好的。

    1
    2
    <?php
        ;print 123;

    这里多余的;分号将前面的不可见字符转换为未定义的常量引用(表达式为语句)。作为回报,PHP提供了一个有用的通知。好的。

  • 变量名前面缺少"$"符号

    PHP中的变量由美元符号和变量名表示。好的。

    美元符号($是将标识符标记为变量名的符号。如果没有这个符号,标识符可以是语言关键字或常量。好的。

    当PHP代码从另一种语言(C、Java、JavaScript等)编写的代码中被翻译时,这是一个常见的错误。在这种情况下,变量类型的声明(原始代码是用使用类型化变量的语言编写的)也可能会溜出并产生此错误。好的。

  • 转义引号

    如果在字符串中使用\,它有一个特殊的含义。这被称为"转义字符",通常告诉解析器从字面上取下一个字符。好的。

    示例:echo 'Jim said \'Hello\'';将打印Jim said 'hello'。好的。

    如果转义字符串的右引号,则右引号将按字面和不按预期接受,即作为字符串的一部分作为可打印的引号,而不是关闭字符串。这通常在打开下一个字符串或脚本末尾后显示为分析错误。好的。

    在Windows中指定路径时非常常见的错误:"C:\xampp\htdocs\"是错误的。你需要"C:\\xampp\\htdocs\\"。好的。

  • 好啊。


    意外的(

    开括号通常遵循诸如if/foreach/for/array/list之类的语言结构,或者启动算术表达式。在"strings"、之前的()、单独的$之后,以及在一些典型的声明上下文中,它们在语法上是不正确的。好的。

  • 函数声明参数

    此错误较少见的情况是试图使用表达式作为默认函数参数。这是不支持的,即使在php7中:好的。

    1
    function header_fallback($value, $expires = time() + 90000) {

    函数声明中的参数只能是文字值或常量表达式。与函数调用不同,在函数调用中可以自由使用whatever(1+something()*2)等。好的。

  • 类属性默认值

    类成员声明也一样,只允许文本/常量值,不允许表达式:好的。

    1
    2
    class xyz {                   ?
        var $default = get_config("xyz_default");

    把这些东西放到构造器中。另请参见为什么php属性不允许使用函数?好的。

    再次注意,php 7只允许使用var $xy = 1 + 2 +3;常量表达式。好的。

  • PHP中的javascript语法

    使用javascript或jquery语法在PHP中不起作用,原因很明显:好的。

    1
    2
    <?php      ?
        print $(document).text();

    当发生这种情况时,它通常指示前面未终止的字符串;以及文字节泄漏到PHP代码上下文中。好的。

  • Isset(()),空,键,下一个,当前

    isset()empty()都是语言内置的,而不是函数。他们需要直接访问变量。如果您不小心添加了一对太多的括号,那么您将创建一个表达式:好的。

    1
    2
              ?
    if (isset(($_GET["id"]))) {

    这同样适用于任何需要隐式变量名访问的语言构造。这些内置的是语言语法的一部分,因此不允许使用装饰性的附加圆括号。好的。

    需要变量引用但传递表达式结果的用户级函数会导致运行时错误。好的。

  • 好的。意外的)

  • 缺少函数参数

    在函数调用中不能最后有多余的逗号。php预计会有一个值,因此会抱怨早期结束的)圆括号。好的。

    1
    2
                  ?
    callfunc(1, 2, );

    尾随逗号只能在array()list()构造中使用。好的。

  • 未完成的表达式

    如果您忘记了算术表达式中的某些内容,那么解析器就放弃了。因为它应该如何解释:好的。

    1
    2
                   ?
    $var = 2 * (1 + );

    如果你甚至忘记了结束的),那么你会得到一个关于意外分号的投诉。好的。

  • constant命名

    对于控制语句中被遗忘的变量$前缀,您将看到:好的。

    1
    2
                       ↓    ?
    foreach ($array as wrong) {

    这里的php有时会告诉您它需要一个::。因为类::$variable可能满足预期的$variable表达式..好的。

  • 好的。意外的{

    大括号{}将代码块括起来。它们的语法错误通常表示一些不相关的嵌套。好的。

  • if中不匹配的子表达式

    最常见的不平衡()是如果解析器抱怨打开的卷曲{出现得太早的原因。一个简单的例子:好的。

    1
    2
                                  ?
    if (($x == $y) && (2 == true) {

    数一数你的帕伦斯或者使用一个有助于这一点的IDE。也不要写没有空格的代码。可读性计数。好的。

  • 和在表达式上下文中

    表达式中不能使用大括号。如果你混淆括号和卷发,它将不符合语言语法:好的。

    1
    2
               ?
    $var = 5 * {7 + $x};

    标识符构造有一些例外,例如局部作用域变量${references}。好的。

  • 变量或卷曲变量表达式

    这是相当罕见的。但您也可能会收到{}解析器对复杂变量表达式的投诉:好的。

    1
    2
                          ?
    print"Hello {$world[2{]} !";

    尽管在这种情况下,有更高的可能性出现意外的}。好的。

  • 好的。意外的}

    当遇到"意外的}"错误时,大多数情况下关闭代码块的时间太早。好的。

  • 代码块中的最后一条语句

    对于任何未终止的表达式都可能发生这种情况。好的。

    如果函数/代码块的最后一行缺少尾随的;分号:好的。

    1
    2
    3
    function whatever() {
        doStuff()
    }            ?

    在这里,解析器无法判断您是否仍然想要向函数结果中添加+ 25;或其他内容。好的。

  • 块嵌套无效/忘记{

    有时,当代码块过早关闭或忘记打开{时,您会看到这个解析器错误,甚至:好的。

    1
    2
    3
    4
    5
    function doStuff() {
        if (true)    ?
            print"yes";
        }
    }   ?

    在上面的代码片段中,if没有打开的{花括号。因此,关闭下面的}一个变得多余。因此,下一个关闭的}是为该功能而设计的,与原来打开的{花括号不相关。好的。

    如果没有适当的代码缩进,这种错误就更难发现。使用IDE和括号匹配。好的。

  • 好的。意外的{,预期的(

    需要条件/声明头和代码块的语言构造将触发此错误。好的。

  • 参数列表

    例如,不允许没有参数列表的错误调用函数:好的。

    1
    2
    3
                     ?
    function whatever {
    }
  • 控制语句条件

    如果没有条件,你也不能拥有一个if。好的。

    1
    2
    3
      ?
    if {
    }

    显然,这没有道理。一般的嫌疑犯也一样,如for/foreachwhile/do等。好的。

    If you've got this particular error, you definitely should look up some manual examples.

    Ok.

  • 好啊。


    意外的美元

    当PHP谈到"意外的$end"时,意味着代码过早结束。(字面上的信息有点误导。这不是一个名为"$end"的变量,这是新来者有时会想到的。它指的是"文件结束",eof。)

    Cause: Unbalanced { and } for code blocks / and function or class declarations.

    它几乎总是关于一个丢失的}花括号来关闭前面的代码块。

    • 同样,使用适当的缩进来避免此类问题。

    • 使用带有括号匹配的IDE,找出}的错误所在。大多数IDE和文本编辑器中都有键盘快捷键:

      • Netbeans、phpstorm、komodo:ctrl[ctrl]
      • Eclipse,Aptana:ctrlshiftsp
      • 原子,升华:ctrlm-zend studio ctrlm
      • geany,记事本++:ctrlbdbkbd-joe:ctrlbdbkbd-emacs:c-m-nabbkbd-vim:%

    大多数IDE还突出显示匹配的大括号、括号和括号。这使得很容易检查它们的相关性:

    Bracket matching in an IDE

    未终止的表达式

    对于未终止的表达式或语句,也可能发生Unexpected $end语法/语法分析器错误:

    • $var = func(1,?>EOF公司

    所以,先看看脚本的结尾。对于任何PHP脚本中的最后一条语句,尾随的;通常是多余的。但你应该有一个。正是因为它缩小了这种语法问题的范围。

    缩进的此处文档标记

    另一个常见的情况出现在HereDoc或Nowdoc字符串中。终止标记将忽略前导空格、制表符等:

    1
    2
    3
    4
    5
    print <<< END
        Content...
        Content....
      END;
    # ↑ terminator isn't exactly at the line start

    因此,解析器假定HereDoc字符串一直持续到文件结束(因此"意外的$end")。几乎所有的IDE和突出显示语法的编辑器都会使这一点变得明显或发出警告。

    转义引号

    如果在字符串中使用\,它有一个特殊的含义。这被称为"转义字符",通常告诉解析器从字面上取下一个字符。

    示例:echo 'Jim said \'Hello\'';将打印Jim said 'hello'

    如果转义字符串的右引号,则右引号将按字面和不按预期接受,即作为字符串的一部分作为可打印的引号,而不是关闭字符串。这通常在打开下一个字符串或脚本末尾后显示为分析错误。

    在Windows中指定路径时非常常见的错误:"C:\xampp\htdocs\"是错误的。你需要"C:\\xampp\\htdocs\\"

    可选语法

    在模板中使用语句/代码块的可选语法时,您可以看到这种语法错误,这种情况比较少见。例如,使用if:else:以及缺失的endif;

    参见:

    • php语法错误"意外的$end"
    • 分析错误:语法错误,我的PHP代码中出现意外的文件结尾
    • 分析错误语法错误文件意外结束,使用PHP
    • PHP分析错误:语法错误,CodeIgniter视图中出现意外的文件结尾
    • 分析错误:语法错误,文件意外结束(注册脚本)
    • "分析错误:语法错误,我的uni注册分配意外的$end"
    • 修复php错误:php错误3:意外的文件结尾

    意外TyIF意料之外的意外的其他意外的t结尾

    条件控制块ifelseifelse结构简单。当您遇到语法错误时,很可能只是块嵌套无效→缺少{大括号}或太多。好的。

    enter image description here好的。

  • 由于压痕不正确,缺少{}

    不匹配的代码大括号对于格式不太好的代码很常见,例如:好的。

    1
    2
    if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
    ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){

    如果您的代码看起来像这样,请重新开始!否则它对你或其他任何人都是不可修复的。在互联网上展示这个是没有意义的,以寻求帮助。好的。

    只有当您能够直观地遵循if/else条件及其{代码块}的嵌套结构和关系时,才能修复它。使用您的IDE查看它们是否都是成对的。好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    if (true) {
         if (false) {
                  …
         }
         elseif ($whatever) {
             if ($something2) {
                 …
             }
             else {
                 …
             }
         }
         else {
             …
         }
         if (false) {    //   a second `if` tree
             …
         }
         else {
             …
         }
    }
    elseif (false) {
        …
    }

    任何双}}都不只是关闭一个分支,而是关闭以前的条件结构。因此,坚持一种编码风格;不要在嵌套的if/else树中混合和匹配。好的。

    除了这里的一致性之外,避免冗长的条件也很有帮助。使用临时变量或函数来避免不可读的if表达式。好的。

  • if不能用在表达式中

    新来者经常犯的一个错误是试图在表达式中使用if语句,例如print语句:好的。

    1
    2
                       ?
    echo"<a href='" . if ($link =="example.org") { echo

    当然是无效的。好的。

    您可以使用三元条件,但要注意可读性的影响。好的。

    1
    echo"";

    否则,打破这种输出结构:使用多个ifs和echos。更好的是,使用临时变量,并将条件放在前面:好的。

    1
    2
    if ($link) { $href="yes"; } else { $href="no"; }
    echo"Link";

    为这种情况定义函数或方法也通常是有意义的。好的。控制块不返回"结果"

    现在这种情况不太常见,但一些编码人员甚至试图将if视为可能返回结果:好的。

    1
    $var = if ($x == $y) {"true" };

    在结构上与在字符串串联/表达式中使用if相同。好的。

    • 但是控制结构(if/foreach/while)没有"结果"。
    • 文本字符串"true"也只是一个void语句。

    您必须在代码块中使用赋值:好的。

    1
    if ($x == $y) { $var ="true"; }

    或者,采用?:三元比较法。好的。如果在中频

    您不能在以下条件中嵌套if:好的。

    1
    2
                        ?
    if ($x == true and (if $y != false)) { ... }

    这显然是多余的,因为andor已经允许链接比较。好的。

  • Forgotton ;分号

    再一次:每个控制块都需要是一个语句。如果前面的代码段没有以分号结尾,那么这是一个保证语法错误:好的。

    1
    2
    3
                    ?
    $var = 1 + 2 + 3
    if (true) {}

    顺便说一句,{…}代码块中的最后一行也需要分号。好的。

  • 分号太早

    现在责怪特定的编码风格可能是错误的,因为这个陷阱太容易忽略了:好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
                ?
    if ($x == 5);
    {
        $y = 7;
    }
    else           ←
    {
        $x = -1;    
    }

    这比你想象的要频繁。好的。

    • 当使用;终止if ()表达式时,它将执行一个void语句。;变成了自己的一个空的{}
    • 因此,{…}块与if分离,并始终运行。
    • 因此,else不再与开放的if构造有关系,这就是为什么这会导致意外的t其他语法错误。

    这也解释了这种语法错误的细微变化:好的。

    1
    if ($x) { x_is_true(); }; else { something_else(); };

    代码块{…}后的;终止整个if。构造,语法上切断else分支。好的。

  • 不使用代码块

    在语法上允许在if/elseif/else分支中省略大括号{}。不幸的是,这是一种语法风格,非常常见于不精通的编码人员。(在错误的假设下,打字或阅读速度更快)。好的。

    然而,这很可能会破坏语法。迟早,附加语句将进入if/else分支:好的。

    1
    2
    3
    4
    5
    6
    7
    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     ←
    else
        $z = 0;

    但要实际使用代码块,您必须编写{}代码块!好的。

    Even seasoned programmers avoid this braceless syntax, or at least
    understand it as an exceptional exception to the rule.

    Ok.

  • Else/Elseif顺序错误

    当然,提醒自己的一件事是有条件的顺序。好的。

    1
    2
    3
    4
    if ($a) {}
    else {}
    elseif ($b) {}

    你可以随心所欲地拥有多个elseif,但else必须排在最后。就这样。好的。

  • 类声明

    如上所述,类声明中不能有控制语句:好的。

    1
    2
    3
    4
    class xyz {
        if (true) {
            function ($var) {}
        }

    在这种情况下,您要么忘记了函数定义,要么过早地关闭了一个}。好的。

  • 意外的其他

    混合php和html时,if/elseif的结束}必须与下一个elseif/else位于同一php块中。这将产生错误,因为关闭if}需要是elseif的一部分:好的。

    1
    2
    3
    4
    5
    6
    <?php if ($x) { ?>
        html
    <?php } ?>
    <?php elseif ($y) { ?>
        html
    <?php } ?>

    正确的格式:好的。

    1
    2
    3
    4
    5
    <?php if ($x) { ?>
        html
    <?php } elseif ($y) { ?>
        html
    <?php } ?>

    这或多或少是不正确缩进的一种变化——大概是基于错误的编码意图。您不能在ifelseifelse结构令牌之间混用其他语句:好的。

    1
    2
    3
    4
    5
    6
    7
    8
    if (true) {
    }
    echo"in between";    ←
    elseif (false) {
    }
    ?> text <?php      ←
    else {
    }

    两者都只能出现在{…}代码块中,而不能出现在控制结构标记之间。好的。

    • 不管怎么说,这是不合理的。当php在ifelse分支之间跳转时,并不是有"未定义"的状态。
    • 您必须决定打印语句属于/或是否需要在两个分支中重复。

    也不能在不同的控制结构之间划分if/else:好的。

    1
    2
    3
    4
    foreach ($array as $i) {
        if ($i) {}
    }
    else {}

    ifelse之间没有句法关系。foreach的词汇量范围以}结尾,因此if结构没有继续的意义。好的。

  • TyEndif

    如果有人抱怨意外的t结尾,您使用的是可选的语法样式if:elseif:号?else:号?埃多克斯1〔27〕。你真的应该三思而后行。好的。

    • 一个常见的陷阱是混淆了与;分号极其相似的:冒号。(见"分号太早")。好的。

    • 由于缩进在模板文件中很难跟踪,因此在使用替代语法时,越可能您的endif;与任何if:都不匹配。好的。

    • 使用} endif;。是一个双重的if终止符。好的。

    而"意料之外的$end"通常是忘记收市的}花括号的价格。好的。

  • 任务与比较

    因此,这不是语法错误,但在本文中值得一提:好的。

    1
    2
    3
           ?
    if ($x = true) { }
    else { do_false(); }

    这不是一个==/===比较,而是一个=分配。这是相当微妙的,很容易导致一些用户无助地编辑整个条件块。当心意外的任务,首先-当你遇到一个逻辑错误/错觉。好的。

  • 好啊。


    意外TyIF意外的t ou foreach意外的tu意外的时间意外Tydoo意想不到的T_回声

    控制结构如ifforeachforwhilelistglobalreturndoprintecho只能用作语句。他们通常一个人住在一条线上。

  • 分号;你在哪里?

    如果解析器抱怨控制语句,那么您是否在前一行中遗漏了分号?

    1
    2
    3
                 ?
    $x = myfunc()
    if (true) {

    解决方案:查看前一行;添加分号。

  • 类声明

    发生这种情况的另一个位置是在类声明中。在类部分中,只能列出属性初始化和方法部分。不允许存在代码。

    1
    2
    3
    class xyz {
        if (true) {}
        foreach ($var) {}

    这种语法错误通常会出现在嵌套不正确的{}中。尤其是当函数代码块过早关闭时。

  • 表达式上下文中的语句

    大多数语言结构只能用作语句。它们不应该放在其他表达式中:

    1
    2
                       ?
    $var = array(1, 2, foreach($else as $_), 5, 6);

    同样,您不能在字符串、数学表达式或其他地方使用if

    1
    2
    3
                   ?
    print"Oh," . if (true) {"you!" } ." won't work";
    // Use a ternary condition here instead, when versed enough.

    对于在表达式中嵌入if样条件,通常需要使用?:三元计算。

    这同样适用于forwhileglobalecho和较小范围的list

    1
    2
              ?
    echo 123, echo 567,"huh?";

    print()是一种内置的语言,可以在表达式上下文中使用。(但很少有意义。)

  • 保留关键字作为标识符

    对于用户定义的函数或类名,也不能使用doif等语言构造。(可能在pH7.但即使这样也不可取。)


  • 意外的t_等于意外的t_大于或等于意外的t_相同意外的t不等于意外的t_不相同意外的t_小于或等于意外的<。意外的>

    比较运算符,如==>====!=<>!==<=<>主要应用于表达式,如if表达式。如果解析器抱怨它们,那么通常意味着它们周围的()pares不正确或不匹配。

  • 父母分组

    尤其是对于具有多重比较的if语句,必须注意正确计算左括号和右括号:

    1
    2
    3
                            ?
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          ↑

    这里的if条件已经被)终止了。

    一旦您的比较变得足够复杂,通常会有助于将其拆分为多个嵌套的if结构。

  • isset()与比较混合

    一个常见的新来者是Pitfal试图将isset()empty()与比较相结合:

    1
    2
                            ?
    if (empty($_POST["var"] == 1)) {

    甚至:

    1
    2
                        ?
    if (isset($variable !=="value")) {

    这对PHP没有意义,因为issetempty是只接受变量名的语言构造。比较结果也没有意义,因为输出只是/已经是一个布尔值。

  • 混淆>=大或等于=>数组运算符

    两个操作符看起来有些相似,因此有时会混淆:

    1
    2
             ?
    if ($var => 5) { ... }

    您只需要记住这个比较运算符被称为"大于或等于"就可以正确地进行比较。

    另请参见:PHP中的if语句结构

  • 没什么可比的

    如果两个比较属于同一个变量名,则也不能组合使用:

    1
    2
                     ?
    if ($xyz > 5 and < 100)

    PHP无法推断您打算再次比较初始变量。表达式通常根据运算符优先级配对,因此当看到<时,只剩下原始变量的布尔结果。

    另请参见:意外的t_小于或等于

  • 比较链

    不能将变量与一行运算符进行比较:

    1
    2
                      ?
     $reult = (5 < $x < 10);

    这必须分成两个比较,分别与$x进行比较。

    这实际上更像是黑名单表达式(由于等价的运算符关联性)。在一些C样式的语言中,它在语法上是有效的,但是PHP也不会将其解释为预期的比较链。

  • 意外的>意外的<

    大于>或小于<的运算符没有自定义T_XXX标记器名称。虽然它们可以像其他的一样放错地方,但您经常会看到解析器抱怨它们的错误引用字符串和混合HTML:

    1
    2
    3
                            ?
    print"Hello";
                     ↑

    这相当于一个字符串"被比较>到一个文字常量Hello,然后另一个<比较。或者至少这是PHP看到的。实际原因和语法错误是字符串"过早终止。

    也不可能嵌套php start标记:

    1
    2
    <?php echo <?php my_func(); ?>
               ↑
  • 参见:

    • php意外的t_is_not_equal错误
    • 语法错误,意外的t_等于
    • RETURN语句语法错误
    • http://forums.phpfreaks.com/topic/96891-parse-error-syntax-error-unexpected-t-is-not-identifier-expecting-or/


    "未被发现"?(P)如果你尝试使用无主控制操作程序EDOCX1的英文本16,在一个版本的PHP prior to PHP 7中,你会得到这个错误。(p)字母名称"未被发现"?预期变量(P)类似的错误可以为无效类型,包括:(p)字母名称(P)Which again indicates an outdated php version being used(either the cli version EDOCX1 original 17 or the webserver bound one EDOCX1 universifical 18).(p)


    Unexpected T.-lnumber(P)The Token EDOCX1 English 0 refers to a long/number.(p)

  • 无效变量名称(P)In php,and most other programming languages,variables cannot start with a number.第一个特点必须是Alphabetic或是Undersecre。(p)字母名称(P)字母名称(p)
    • (P)Quite often comes up for using EDOCX1 plus 1-placeholders EDOCX1 plus 2 in php_context:(p)字母名称(P)Where the callback should have been quoted.(Now the EDOCX1 theography 3 common regex flag has been depressed.But it's sometimes still misused in EDOCX1 plication 4 communal functions.)(p)
    • (P)The same identifier constraint applies to object properties,BTW.(p)字母名称
    • (P)While the Tokenizer/Parser does not allow a逐字逐句EDOCX1/音标5 as variable name,one could use EDOCX1/音标6 or EDOCX1/音标7.Which is a syntactic workound for non-standard identifiers.(It's best to think of it a s a local scope look up.But generally:prefer plain arrays for such cases!(p)
    • (P)Amusingly,but very much not recommended,PHPS parser allows unicode-identifiers;such that EDOCX1 simplifical 8 would be valid.(Unlike a逐字逐句EDOCX1)(p)
  • Stray Array Entry(P)An unexpected long can also occur for array declarations-when missing EDOCX1(p)字母名称(P)Or like function calls and declarations,and other constructs:(p)
    • 字母名称
    • 字母名称
    • 字母名称

    (P)So usually there's one of EDOCX1 literal 14 common or EDOCX1 big 10 communal missing for separating lists or expressions.(p)

  • Misquoted HTML(P)and again,misquoted strings are a frequent source of stray numbers:(p)字母名称(P)这类案件应当受到更多的待遇,或不象未被揭露的那样受到惩处。(p)
  • Other identifiers(P)Neither functions,classes,nor names can be named beginning with a number either:(p)字母名称(P)已新增此相片至他的最爱。(p)

  • Unexpected'.(P)这可能是由于在一个可变名称中保留了无效的特性。变量名称必须遵循这些规则:(p)布尔奇1


    3.Unexpected"continue"(t'uu continue)(P)EDOCX1 19是一个声明(如for,or if)和必须呼吁立场。It cannot be used as part of an expression.Partly because continue doesn't return a value,but in an expression every sub-expression must result in some value so the overall expression results in a value.That's the difference between a statement and an expression.(p)(P)That means EDOCX1 penographic 19 cannot be used in a ternary statement or any statement that requires a return value.(p)Unexpected'break'(t u break)(P)同一天为EDOCX1写一首歌It's also not usable in expression context,but a strict statement(on the same level a s EDOCX1 penographic 22 or an EDOCX1 penographic 23 commock).(p)2.Unexpected'return'(t u return)(P)Now this might be more surprising for EDOCX1 plus 24,but that's also just a block-level statement.It does return a value(or null)to the higher scope/function,but it does not evaluate as expression itself.-那是:在以东没有点-25(p)


    2.Unexpected"endwhile"(t'endwhile)(P)如果有一个以上的错误,就使用一个结肠。(p)字母名称(P)Alternative to this syntax is using curly brackets(p)字母名称(P)http://php.net/manual/en/control-structures.while.php(p)


    关于解析:PHP解析/语法错误;如何解决它们?

    PHP parse/syntax errors; and how to solve them?

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

    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.

    但并非每一种情况都符合另一种情况。然而,有一些通用的步骤来解决语法错误。这些参考总结了常见的缺陷:

    • 意外的T_字符串

    • 意外的t_变量意外的"$varname"(t_变量)

    • 意外的t_常量已封装字符串意外的t_已封装和空白

    • 意外的美元

    • 意外的tu函数…

    • 意外的{意外的}意外的(意外的)

    • 意外的[意外的]

    • 意外的T_如果意外的T_foreach意外的T_对于意外的T_而意外的T_做意外的T_打印意外的T_回声

    • 意外的数字

    • 出乎意料?

    • 意外继续(t_continue)意外继续(t_break)意外继续(t_return)

    • 意想不到的"="

    • 意外的t_inline_html…

    • 意想不到的T·帕玛伊姆·内库多塔伊姆…

    • 意外的t对象运算符…

    • 意外的双箭头…

    • 意想不到的Tu sl…

    • 意外的T布尔值或…意外的T布尔值和…

    • 意外的t_等于意外的t_大于或等于意外的t_相同意外的t不等于意外的t_不相同意外的t_小于或等于意外的<。意外的>

    • 意外的分隔符…

    • 输入中出现意外字符:"\"(ascii=92)状态=1

    • 意外的"public"(t_public)意外的"private"(t_private)意外的"protected"(t_protected)意外的"final"(t_final)…

    • 意外的静态…

    • 意外的Tu类…

    • 意外的数字

    • 意外的,(逗号)

    • 未执行.

    • 意外的;(分号)

    • 意外的*(星号)

    • 意外的:(冒号)

    密切相关的参考文献:

    • 这个错误在PHP中意味着什么?(运行时错误)
      • 分析错误:语法错误,意外的t_xxx
      • 分析错误:语法错误,意外的t_和u空白
      • 分析错误:语法错误,意外的t_变量
    • 这个符号在PHP中意味着什么?(语言标记)
    • 这些""智能‘’引号对php没有任何意义。

    还有:

    • php.net上的php手册及其各种语言标记
    • 或者维基百科的PHP语法介绍。
    • 最后一个是我们的php标签wiki。

    虽然堆栈溢出也欢迎新手编码人员,但它主要针对专业编程问题。

    • 回答每个人的编码错误和狭窄的打字错误通常被认为是离题的。
    • 因此,在发布语法修复请求之前,请花时间遵循基本步骤。
    • 如果你还必须这样做,请展示你自己的解决方案,尝试的修复,以及你的思考过程,看什么是看起来或可能是错误的。

    如果浏览器显示错误消息,如"syntax error:非法字符",那么它实际上与PHP无关,而是一个javascript语法错误。

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


    什么是语法错误?

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

    Function definition syntax abstract好的。最重要的提示

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

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

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

      Expected: semicolon好的。

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

    如何解释分析器错误

    典型的语法错误消息为:好的。

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

    Ok.

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

    T_STRING这样的绰号解释了解析器/标记器最终无法处理的符号。然而,这不一定是导致语法错误的原因。好的。

    查看以前的代码行也很重要。通常,语法错误只是之前发生的意外。错误行号就是解析器最终放弃处理所有错误的地方。好的。解决语法错误

    有许多方法可以缩小范围并解决语法问题。好的。

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

      • 对于失控的字符串和错位的运算符,这通常是您找到罪犯的地方。好的。

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

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

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

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

    • 看看语法着色!好的。

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

      • 操作工+-*/.也应着色清楚。否则,他们可能处于错误的环境中。好的。

      • 如果看到字符串颜色化扩展得太远或太短,则会发现一个未捕获或丢失的结束"'字符串标记。好的。

      • 相邻有两个相同颜色的标点符号也会带来麻烦。通常,如果不是++--或运算符后面的括号,则运算符是单独的。在大多数上下文中,直接跟在后面的两个字符串/标识符是不正确的。好的。

    • 空白区是你的朋友。遵循任何编码样式。好的。

    • 暂时分开长队。好的。

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

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

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

      • 在以下值之间添加换行符:好的。

      • 您可以轻松识别为正确的代码,
      • 你不确定的部分,
      • 以及解析器抱怨的行。< BR>
      • 对长代码块进行分区确实有助于找到语法错误的根源。好的。

    • 注释掉有问题的代码。好的。

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

      • 一旦排除了解析错误,就发现了问题源。仔细看。好的。

      • 有时您希望临时删除完整的函数/方法块。(以防不匹配的大括号和错误缩进的代码。)好的。

      • 当您无法解决语法问题时,请尝试从头重写注释掉的部分。好的。

    • 作为新来者,请避免一些混淆的语法结构。好的。

      • 三元? :条件运算符可以压缩代码,确实有用。但在所有情况下,它并不能帮助可读性。宁可用普通的if语句,也不可译。好的。

      • php的可选语法(if:/elseif:/endif;对于模板来说很常见,但可以说比普通的{代码}块更不容易遵循。好的。

    • 最常见的新来者错误是:好的。

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

      • "'的字符串引号不匹配,且内有未转义的引号。好的。

      • 忘记了运算符,特别是字符串.连接。好的。

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

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

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

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

    • 如果无法修复以前工作的代码,请还原其备份。好的。

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

      • 尝试使用grep --color -P -n"\[\x80-\xFF\]" file.php作为第一个找到非ASCII符号的度量。好的。

      • 尤其是BOM、零宽度空格或不间断空格和智能引号可以定期找到它们进入源代码的方式。好的。

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

      • php只支持akbd换行,而不是
        akbd回车。好的。

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

      • 它通常只在使用单行//#注释时作为问题出现。当换行符被忽略时,多行/*...*/注释很少会干扰解析器。好的。

    • 如果您的语法错误没有通过网络传输:您的机器上出现语法错误。但是在网上发布同样的文件已经不再显示它了。这只能意味着两件事之一:好的。

      • 你看错文件了!好的。

      • 或者您的代码包含不可见的游离Unicode(见上文)。您可以很容易地发现:只需将代码从Web表单复制回文本编辑器。好的。

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

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

      • ,用于通过Web服务器调用的。好的。

      这些不一定是一样的。尤其是在使用框架时,您会将它们匹配起来。好的。

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

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

    如果所有其他都失败了,你可以在谷歌上搜索你的错误信息。语法符号并不容易搜索(不过堆栈溢出本身是由symbolhound索引的)。因此,在找到相关内容之前,可能需要再看几页。好的。

    进一步指南:好的。

    • David Sklar的PHP调试基础知识
    • Jason McCreary修复PHP错误
    • PHP错误–Mario Lurig的10个常见错误
    • 常见的PHP错误和解决方案
    • 如何排除和修复WordPress网站
    • 设计人员PHP错误消息指南-粉碎杂志

    死亡的白屏

    如果您的网站只是空白的,那么通常是语法错误造成的。使用以下选项启用其显示:好的。

    • error_reporting = E_ALL
    • display_errors = 1

    一般来说,在您的php.ini中,或通过.htaccess用于mod_php,甚至是带有fastcgi设置的.user.ini。好的。

    在中断的脚本中启用它太晚了,因为PHP甚至无法解释/运行第一行。一个快速的解决方法是创建一个包装脚本,比如test.php:好的。

    1
    2
    3
    4
    <?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):

  • NETBeBe[免费]
  • phpstorm[199美元]
  • 带PHP插件的Eclipse[free]
  • Sublime(80美元)(主要是一个文本编辑器,但可以用插件扩展,如PHP语法分析器)

  • 意外的[

    现在,在过时的PHP版本中,通常会看到意外的[数组括号。由于php>=5.4,因此短数组语法可用。较旧的安装仅支持array()

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

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

    1
    2
    $result = get_whatever()["key"];
                          ?

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

    不过,只需升级php安装就可以了。对于共享的网络托管计划,如果可以使用SetHandler php56-fcgi来启用较新的运行时,则应首先进行研究。

    参见:

    • 函数结果解引用的php语法→从php 5.4开始可能
    • PHP语法错误,意外的"["
    • 数组的简写:是否有像或[]这样的字面语法?
    • php 5.3.10 vs php 5.5.3语法错误意外"["
    • 数组()和[]之间的php差异
    • PHP数组语法分析错误左方括号"["

    顺便说一句,如果你真的对老版本和慢版本的PHP抱有兴趣的话,还有预处理器和PHP5.4语法向下转换器。

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

    如果不是PHP版本不匹配,那么通常是一个简单的拼写错误或新用户语法错误:

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

      1
      2
      protected $var["x"] ="Nope";
                    ?
    • [与大括号{或括号(混淆是一个常见的疏忽。

      1
      2
      foreach [$a as $b)
              ?

      甚至:

      1
      2
      function foobar[$a, $b, $c] {
                     ?
    • 或者尝试将常量(php 5.6之前)取消引用为数组:

      1
      2
      $var = const[123];
             ?

      至少php将const解释为一个常量名。

      如果要访问数组变量(这是这里的典型原因),则添加前导的$sigil,使其成为$varname

    • 您试图在关联数组的成员上使用global关键字。这不是有效的语法:

      1
      global $var['key'];

    < BR>

    意外的]右方括号

    这是比较少见的,但是终止数组]括号也有语法错误。

    • 同样,与)括号或}花括号不匹配是常见的:

      1
      2
      function foobar($a, $b, $c] {
                                ?
    • 或者尝试在没有数组的情况下结束数组:

      1
      $var = 2];

      通常出现在多行和嵌套数组声明中。

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

      如果是这样,请使用您的IDE进行括号匹配,以查找任何过早的]数组关闭。至少要使用更多的间距和换行符来缩小范围。


    意外的t_变量

    "意外的T_VARIABLE表示有一个文本$variable名称,它不适合当前的表达式/语句结构。

    purposefully abstract/inexact operator+$variable diagram

  • 缺少分号

    它通常表示前一行中缺少分号。语句后面的变量赋值是一个很好的指示器,可以在其中查找:

    1
    2
    3
           ?
    func1()
    $var = 1 + 2;     # parse error in line +2
  • 字符串连接

    一个常见的错误是字符串与遗忘的.运算符的串联:

    1
    2
                                   ?
    print"Here comes the value:"  $value;

    顺便说一句,你应该喜欢字符串插值(双引号中的基本变量),只要这有助于可读性。这样就避免了这些语法问题。

    String interpolation is a scripting language core feature. No shame in utilizing it. Ignore any micro-optimization advise about variable . concatenation being faster. It's not.

  • 缺少表达式运算符

    当然,同样的问题也可能出现在其他表达式中,例如算术运算:

    1
    2
               ?
    print 4 + 7 $var;

    这里PHP无法猜测是否应该添加、减去或比较变量等。

  • 列表

    与数组填充中的语法列表相同,其中解析器还指示预期的逗号,,例如:

    1
    2
                                          ?
    $var = array("1" => $val, $val2, $val3 $val4);

    或函数参数列表:

    1
    2
                                    ?
    function myfunc($param1, $param2 $param3, $param4)

    同样地,您是否在listglobal语句中看到这种情况,或者在for循环中缺少;分号时看到这种情况。

  • 类声明

    这个解析器错误也发生在类声明中。只能分配静态常量,不能分配表达式。因此,解析器将变量作为分配的数据来抱怨:

    1
    2
    class xyz {      ?
        var $value = $_GET["input"];

    不匹配的}闭合花括号尤其可以在这里引出。如果方法过早终止(请使用适当的缩进!)则通常会将一个零散变量放错在类声明体中。

  • 标识符后的变量

    也不能让变量直接跟在标识符后面:

    1
    2
                 ?
    $this->myFunc$VAR();

    顺便说一句,这是一个常见的例子,目的可能是使用变量。在这种情况下,例如使用$this->{"myFunc$VAR"}();进行变量属性查找。

    Take in mind that using variable variables should be the exception. Newcomers often try to use them too casually, even when arrays would be simpler and more appropriate.

  • 语言构造后缺少parens

    草率的打字可能会导致忘记左括号对于ifforforeach报表:

    1
    2
           ?
    foreach $array as $key) {

    解决方案:在语句和变量之间添加缺少的opening (

  • 否则不期望条件
    1
    2
         ?
    else ($var >= 0)

    解决方案:取消else的条件或使用elseif

  • 需要支架封闭
    1
    2
         ?
    function() uses $var {}

    解决方案:在$var周围加括号。

  • 不可见空白

    如"不可见的游离Unicode"(如不间断空格)的参考答案中所述,您可能还会看到此错误,因为不可靠的代码如下:

    1
    2
    3
    <?php
                              ?
    $var = new PDO(...);

    它在文件开头以及复制和粘贴代码中相当普遍。如果代码在视觉上不包含语法问题,请使用十六进制编辑器进行检查。

  • 也见

    • 搜索:意外的t_变量

    不期望的T ^ U常数封装^ U弦不期望的T ^ U封装和U ^ Whitespace

    不受欢迎的名字叫T_CONSTANT_ENCAPSED_STRINGT_ENCAPSED_AND_WHITESPACERefer to quoted "string"

    它们在不同的背景下使用,但语法问题是相似的。在双Quoted String context,while t 恒定…弦在php表达式或声明中通常是Astray。

  • 不正确的可变内插

    而且,它经常出现不正确的php变量内插法:

    1
    2
                              ?     ?
    echo"Here comes a $wrong['array'] access";

    Quoting arrays keys is a must in PHP context.但在双重弦乐(或遗产)中,这是一个错误。帕瑟抱怨说,单个集装箱是'string'的,因为这通常是一个文学标识/钥匙在那里。

    更精确地使用PHP2-style simple syntax within double contributions for array references:

    ZZU1

    Nested arrays or deeper object references however require the complex curly string expression syntax:

    1
    echo"Use {$array['as_usual']} with curly syntax.";

    如果不确定,这很安全。即使考虑得更多而且,最好是实际使用不同的句法着色。

  • 错综复杂

    如果一个字符串跟随一个表情,但缺少一个结构化或其他操作员,那么你会看到PHP complain about the string literal:

    1
    2
                           ?
    print"Hello" . WORLD " !";

    Php just can't guess the string was meant to be appened there.

  • 混淆弦

    当混淆弦乐划分器时,同样的语法错误出现。一条由单一的'或双重的"开始的弦乐,也以同样的方式结束。

    1
    2
    3
                    ?
    print"click here";
          ????????????????????????????????????????

    以双重摊款为例。但双重分摊也被指定用于HTML属性。然而,在单一摊款中作为第二条弦的一部分被解释为共有的运算符。

    Tip: Set your editor/IDE to use slightly distinct colorization for single and double quoted strings. (It also helps with application logic to prefer e.g. double quoted strings for textual output, and single quoted strings only for constant-like values.)

    这是一个很好的例子,说明你在第一个位置不应打破双重摊款。Instead just use proper \"

    1
    print"click here";

    当这也能引导语法混淆时,所有更好的编辑/编辑都能通过将离散配额染色而得到帮助。

  • 错失开价

    等价地被遗忘了打开"/'

    1
    2
                   ?
     make_url(login', 'open');

    在一个字母缩写后,当Obviously login时,会成为一个字符串。

  • 阵列列表

    如果你错过了一个,,就像在一个阵列创作块,帕瑟会看到两条消费者弦乐:

    1
    2
    3
    4
    array(               ?
        "key" =>"value"
        "next" =>"....",
    );

    注意到最后一条线可能总是含有一个额外的comma,但在两条线之间的一条线是不可原谅的。没有高清语法,很难发现。

  • 函数参数列表

    SAME thing for function calls:

    1
    2
                             ?
    myfunc(123,"text","and" "more")
  • 鲁纳韦弦乐

    一个常见的变异是简单地忘记了弦乐终结者:

    1
    2
    3
    4
                                    ?
    mysql_evil("SELECT * FROM stuffs);
    print"
    'ok'";
          ?

    这是PHP投诉两条弦乐文学直接跟随彼此。但真正的原因是未知的前奏。

  • See also

    • 相联阵列内插法
    • PHP-Syntax Error,unexpected t n封装字符串
    • 语法误差,不期望恒定 xE4包封在php
    • 在SQL查询中不期望的T U常数封装 U条纹误差

    意外的T_字符串

    T_STRING有点用词不当。它不指引用的"string"。这意味着遇到了原始标识符。这可以是从bare字到剩余的CONSTANT或函数名、被遗忘的无引号字符串或任何纯文本。好的。

  • 错误引用的字符串

    但是,这种语法错误最常见于错误引用的字符串值。任何未转义和离群的"'引语将构成无效的表达式:好的。

    1
    2
                   ?                  ?
     echo"click here";

    语法突出显示会使这种错误非常明显。记住使用反斜杠转义\"双引号或\'单引号是很重要的,这取决于哪个引号用作字符串附件。好的。

    • 为了方便起见,在输出包含双引号的纯HTML时,您应该首选外部单引号。
    • 如果要插入变量,请使用双引号字符串,但要注意转义文字"双引号。
    • 对于较长的输出,更倾向于使用多条echoprint线路,而不是进出。最好还是考虑一下Heredoc部分。

    另请参见PHP中单引号和双引号字符串的区别是什么?.好的。

  • 未闭合字符串

    如果您错过了一个结束的",那么一个语法错误通常会在稍后出现。在下一个预期的字符串值之前,未终止的字符串通常会消耗一点代码:好的。

    1
    2
    3
    4
                                                           ?
    echo"Some text", $a_variable,"and some runaway string ;
    success("
    finished");
             ?

    解析器可能会抗议的不仅仅是文字T_STRING。另一种常见的变化是用于不带引号的文本HTML的Unexpected '>'。好的。

  • 非编程字符串引号

    如果您从博客或网站复制和粘贴代码,有时会导致代码无效。字体引号不是PHP期望的:好的。

    1
    $text = ’Something something..+"these ain't quotes";

    排版/智能引号是Unicode符号。PHP将它们视为相邻字母数字文本的一部分。例如,"these被解释为常量标识符。但随后的任何文本文本文本被解析器视为一个空字/t_字符串。好的。

  • 丢失的分号;再次

    如果在前面的行中有一个未终止的表达式,那么下面的任何语句或语言构造都将被视为原始标识符:好的。

    1
    2
    3
           ?
    func1()
    function2();

    PHP只是不知道您是打算一个接一个地运行两个函数,还是打算将它们的结果相乘、相加、比较,或者只运行一个||或另一个。好的。

  • PHP脚本中的短开放标记和

    这是相当罕见的。但是,如果启用了short-open标记,那么就不能用XML声明开始PHP脚本:好的。

    1
    2
          ?
    <?xml version="1.0"?>

    PHP将看到,并自行回收。它不明白迷路的xml是什么意思。它将被解释为常量。但是,version将被视为另一个文字/常量。由于没有表达式操作符,解析器无法理解后面的两个文本/值,这将是一个解析器失败。好的。

  • 不可见的Unicode字符

    语法错误最可怕的原因是Unicode符号,例如不间断空格。PHP允许使用Unicode字符作为标识符名称。如果您收到一个T_字符串解析器对完全不可靠的代码的投诉,例如:好的。

    1
    2
    <?php
        print 123;

    您需要弹出另一个文本编辑器。甚至是一个十六进制编辑器。这里看起来像普通空格和换行符的内容可能包含不可见的常量。基于Java的IDE有时会忽略UTF-8 BOM中的内、零宽度空间、段落分隔符等。尝试重新编辑所有内容,删除空白并添加正常空间。好的。

    您可以通过在每行开始处添加冗余的;语句分隔符来缩小范围:好的。

    1
    2
    <?php
        ;print 123;

    这里多余的;分号将前面的不可见字符转换为未定义的常量引用(表达式为语句)。作为回报,PHP提供了一个有用的通知。好的。

  • 变量名前面缺少"$"符号

    PHP中的变量由美元符号和变量名表示。好的。

    美元符号($是将标识符标记为变量名的符号。如果没有这个符号,标识符可以是语言关键字或常量。好的。

    当PHP代码从另一种语言(C、Java、JavaScript等)编写的代码中被翻译时,这是一个常见的错误。在这种情况下,变量类型的声明(原始代码是用使用类型化变量的语言编写的)也可能会溜出并产生此错误。好的。

  • 转义引号

    如果在字符串中使用\,它有一个特殊的含义。这被称为"转义字符",通常告诉解析器从字面上取下一个字符。好的。

    示例:echo 'Jim said \'Hello\'';将打印Jim said 'hello'。好的。

    如果转义字符串的右引号,则右引号将按字面和不按预期接受,即作为字符串的一部分作为可打印的引号,而不是关闭字符串。这通常在打开下一个字符串或脚本末尾后显示为分析错误。好的。

    在Windows中指定路径时非常常见的错误:"C:\xampp\htdocs\"是错误的。你需要"C:\\xampp\\htdocs\\"。好的。

  • 好啊。


    意外的(

    开括号通常遵循诸如if/foreach/for/array/list之类的语言结构,或者启动算术表达式。在"strings"、之前的()、单独的$之后,以及在一些典型的声明上下文中,它们在语法上是不正确的。好的。

  • 函数声明参数

    此错误较少见的情况是试图使用表达式作为默认函数参数。这是不支持的,即使在php7中:好的。

    1
    function header_fallback($value, $expires = time() + 90000) {

    函数声明中的参数只能是文字值或常量表达式。与函数调用不同,在函数调用中可以自由使用whatever(1+something()*2)等。好的。

  • 类属性默认值

    类成员声明也一样,只允许文本/常量值,不允许表达式:好的。

    1
    2
    class xyz {                   ?
        var $default = get_config("xyz_default");

    把这些东西放到构造器中。另请参见为什么php属性不允许使用函数?好的。

    再次注意,php 7只允许使用var $xy = 1 + 2 +3;常量表达式。好的。

  • PHP中的javascript语法

    使用javascript或jquery语法在PHP中不起作用,原因很明显:好的。

    1
    2
    <?php      ?
        print $(document).text();

    当发生这种情况时,它通常指示前面未终止的字符串;以及文字节泄漏到PHP代码上下文中。好的。

  • Isset(()),空,键,下一个,当前

    isset()empty()都是语言内置的,而不是函数。他们需要直接访问变量。如果您不小心添加了一对太多的括号,那么您将创建一个表达式:好的。

    1
    2
              ?
    if (isset(($_GET["id"]))) {

    这同样适用于任何需要隐式变量名访问的语言构造。这些内置的是语言语法的一部分,因此不允许使用装饰性的附加圆括号。好的。

    需要变量引用但传递表达式结果的用户级函数会导致运行时错误。好的。

  • 好的。意外的)

  • 缺少函数参数

    在函数调用中不能最后有多余的逗号。php预计会有一个值,因此会抱怨早期结束的)圆括号。好的。

    1
    2
                  ?
    callfunc(1, 2, );

    尾随逗号只能在array()list()构造中使用。好的。

  • 未完成的表达式

    如果您忘记了算术表达式中的某些内容,那么解析器就放弃了。因为它应该如何解释:好的。

    1
    2
                   ?
    $var = 2 * (1 + );

    如果你甚至忘记了结束的),那么你会得到一个关于意外分号的投诉。好的。

  • constant命名

    对于控制语句中被遗忘的变量$前缀,您将看到:好的。

    1
    2
                       ↓    ?
    foreach ($array as wrong) {

    这里的php有时会告诉您它需要一个::。因为类::$variable可能满足预期的$variable表达式..好的。

  • 好的。意外的{

    大括号{}将代码块括起来。它们的语法错误通常表示一些不相关的嵌套。好的。

  • if中不匹配的子表达式

    最常见的不平衡()是如果解析器抱怨打开的卷曲{出现得太早的原因。一个简单的例子:好的。

    1
    2
                                  ?
    if (($x == $y) && (2 == true) {

    数一数你的帕伦斯或者使用一个有助于这一点的IDE。也不要写没有空格的代码。可读性计数。好的。

  • 和在表达式上下文中

    表达式中不能使用大括号。如果你混淆括号和卷发,它将不符合语言语法:好的。

    1
    2
               ?
    $var = 5 * {7 + $x};

    标识符构造有一些例外,例如局部作用域变量${references}。好的。

  • 变量或卷曲变量表达式

    这是相当罕见的。但您也可能会收到{}解析器对复杂变量表达式的投诉:好的。

    1
    2
                          ?
    print"Hello {$world[2{]} !";

    尽管在这种情况下,有更高的可能性出现意外的}。好的。

  • 好的。意外的}

    当遇到"意外的}"错误时,大多数情况下关闭代码块的时间太早。好的。

  • 代码块中的最后一条语句

    对于任何未终止的表达式都可能发生这种情况。好的。

    如果函数/代码块的最后一行缺少尾随的;分号:好的。

    1
    2
    3
    function whatever() {
        doStuff()
    }            ?

    在这里,解析器无法判断您是否仍然想要向函数结果中添加+ 25;或其他内容。好的。

  • 块嵌套无效/忘记{

    有时,当代码块过早关闭或忘记打开{时,您会看到这个解析器错误,甚至:好的。

    1
    2
    3
    4
    5
    function doStuff() {
        if (true)    ?
            print"yes";
        }
    }   ?

    在上面的代码片段中,if没有打开的{花括号。因此,关闭下面的}一个变得多余。因此,下一个关闭的}是为该功能而设计的,与原来打开的{花括号不相关。好的。

    如果没有适当的代码缩进,这种错误就更难发现。使用IDE和括号匹配。好的。

  • 好的。意外的{,预期的(

    需要条件/声明头和代码块的语言构造将触发此错误。好的。

  • 参数列表

    例如,不允许没有参数列表的错误调用函数:好的。

    1
    2
    3
                     ?
    function whatever {
    }
  • 控制语句条件

    如果没有条件,你也不能拥有一个if。好的。

    1
    2
    3
      ?
    if {
    }

    显然,这没有道理。一般的嫌疑犯也一样,如for/foreachwhile/do等。好的。

    If you've got this particular error, you definitely should look up some manual examples.

    Ok.

  • 好啊。


    意外的美元

    当PHP谈到"意外的$end"时,意味着代码过早结束。(字面上的信息有点误导。这不是一个名为"$end"的变量,这是新来者有时会想到的。它指的是"文件结束",eof。)

    Cause: Unbalanced { and } for code blocks / and function or class declarations.

    它几乎总是关于一个丢失的}花括号来关闭前面的代码块。

    • 同样,使用适当的缩进来避免此类问题。

    • 使用带有括号匹配的IDE,找出}的错误所在。大多数IDE和文本编辑器中都有键盘快捷键:

      • Netbeans、phpstorm、komodo:ctrl[ctrl]
      • Eclipse,Aptana:ctrlshiftsp
      • 原子,升华:ctrlm-zend studio ctrlm
      • geany,记事本++:ctrlbdbkbd-joe:ctrlbdbkbd-emacs:c-m-nabbkbd-vim:%

    大多数IDE还突出显示匹配的大括号、括号和括号。这使得很容易检查它们的相关性:

    Bracket matching in an IDE

    未终止的表达式

    对于未终止的表达式或语句,也可能发生Unexpected $end语法/语法分析器错误:

    • $var = func(1,?>EOF公司

    所以,先看看脚本的结尾。对于任何PHP脚本中的最后一条语句,尾随的;通常是多余的。但你应该有一个。正是因为它缩小了这种语法问题的范围。

    缩进的此处文档标记

    另一个常见的情况出现在HereDoc或Nowdoc字符串中。终止标记将忽略前导空格、制表符等:

    1
    2
    3
    4
    5
    print <<< END
        Content...
        Content....
      END;
    # ↑ terminator isn't exactly at the line start

    因此,解析器假定HereDoc字符串一直持续到文件结束(因此"意外的$end")。几乎所有的IDE和突出显示语法的编辑器都会使这一点变得明显或发出警告。

    转义引号

    如果在字符串中使用\,它有一个特殊的含义。这被称为"转义字符",通常告诉解析器从字面上取下一个字符。

    示例:echo 'Jim said \'Hello\'';将打印Jim said 'hello'

    如果转义字符串的右引号,则右引号将按字面和不按预期接受,即作为字符串的一部分作为可打印的引号,而不是关闭字符串。这通常在打开下一个字符串或脚本末尾后显示为分析错误。

    在Windows中指定路径时非常常见的错误:"C:\xampp\htdocs\"是错误的。你需要"C:\\xampp\\htdocs\\"

    可选语法

    在模板中使用语句/代码块的可选语法时,您可以看到这种语法错误,这种情况比较少见。例如,使用if:else:以及缺失的endif;

    参见:

    • php语法错误"意外的$end"
    • 分析错误:语法错误,我的PHP代码中出现意外的文件结尾
    • 分析错误语法错误文件意外结束,使用PHP
    • PHP分析错误:语法错误,CodeIgniter视图中出现意外的文件结尾
    • 分析错误:语法错误,文件意外结束(注册脚本)
    • "分析错误:语法错误,我的uni注册分配意外的$end"
    • 修复php错误:php错误3:意外的文件结尾

    意外TyIF意料之外的意外的其他意外的t结尾

    条件控制块ifelseifelse结构简单。当您遇到语法错误时,很可能只是块嵌套无效→缺少{大括号}或太多。好的。

    enter image description here好的。

  • 由于压痕不正确,缺少{}

    不匹配的代码大括号对于格式不太好的代码很常见,例如:好的。

    1
    2
    if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
    ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){

    如果您的代码看起来像这样,请重新开始!否则它对你或其他任何人都是不可修复的。在互联网上展示这个是没有意义的,以寻求帮助。好的。

    只有当您能够直观地遵循if/else条件及其{代码块}的嵌套结构和关系时,才能修复它。使用您的IDE查看它们是否都是成对的。好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    if (true) {
         if (false) {
                  …
         }
         elseif ($whatever) {
             if ($something2) {
                 …
             }
             else {
                 …
             }
         }
         else {
             …
         }
         if (false) {    //   a second `if` tree
             …
         }
         else {
             …
         }
    }
    elseif (false) {
        …
    }

    任何双}}都不只是关闭一个分支,而是关闭以前的条件结构。因此,坚持一种编码风格;不要在嵌套的if/else树中混合和匹配。好的。

    除了这里的一致性之外,避免冗长的条件也很有帮助。使用临时变量或函数来避免不可读的if表达式。好的。

  • if不能用在表达式中

    新来者经常犯的一个错误是试图在表达式中使用if语句,例如print语句:好的。

    1
    2
                       ?
    echo"<a href='" . if ($link =="example.org") { echo

    当然是无效的。好的。

    您可以使用三元条件,但要注意可读性的影响。好的。

    1
    echo"";

    否则,打破这种输出结构:使用多个ifs和echos。更好的是,使用临时变量,并将条件放在前面:好的。

    1
    2
    if ($link) { $href="yes"; } else { $href="no"; }
    echo"Link";

    为这种情况定义函数或方法也通常是有意义的。好的。控制块不返回"结果"

    现在这种情况不太常见,但一些编码人员甚至试图将if视为可能返回结果:好的。

    1
    $var = if ($x == $y) {"true" };

    在结构上与在字符串串联/表达式中使用if相同。好的。

    • 但是控制结构(if/foreach/while)没有"结果"。
    • 文本字符串"true"也只是一个void语句。

    您必须在代码块中使用赋值:好的。

    1
    if ($x == $y) { $var ="true"; }

    或者,采用?:三元比较法。好的。如果在中频

    您不能在以下条件中嵌套if:好的。

    1
    2
                        ?
    if ($x == true and (if $y != false)) { ... }

    这显然是多余的,因为andor已经允许链接比较。好的。

  • Forgotton ;分号

    再一次:每个控制块都需要是一个语句。如果前面的代码段没有以分号结尾,那么这是一个保证语法错误:好的。

    1
    2
    3
                    ?
    $var = 1 + 2 + 3
    if (true) {}

    顺便说一句,{…}代码块中的最后一行也需要分号。好的。

  • 分号太早

    现在责怪特定的编码风格可能是错误的,因为这个陷阱太容易忽略了:好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
                ?
    if ($x == 5);
    {
        $y = 7;
    }
    else           ←
    {
        $x = -1;    
    }

    这比你想象的要频繁。好的。

    • 当使用;终止if ()表达式时,它将执行一个void语句。;变成了自己的一个空的{}
    • 因此,{…}块与if分离,并始终运行。
    • 因此,else不再与开放的if构造有关系,这就是为什么这会导致意外的t其他语法错误。

    这也解释了这种语法错误的细微变化:好的。

    1
    if ($x) { x_is_true(); }; else { something_else(); };

    代码块{…}后的;终止整个if。构造,语法上切断else分支。好的。

  • 不使用代码块

    在语法上允许在if/elseif/else分支中省略大括号{}。不幸的是,这是一种语法风格,非常常见于不精通的编码人员。(在错误的假设下,打字或阅读速度更快)。好的。

    然而,这很可能会破坏语法。迟早,附加语句将进入if/else分支:好的。

    1
    2
    3
    4
    5
    6
    7
    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     ←
    else
        $z = 0;

    但要实际使用代码块,您必须编写{}代码块!好的。

    Even seasoned programmers avoid this braceless syntax, or at least
    understand it as an exceptional exception to the rule.

    Ok.

  • Else/Elseif顺序错误

    当然,提醒自己的一件事是有条件的顺序。好的。

    1
    2
    3
    4
    if ($a) {}
    else {}
    elseif ($b) {}

    你可以随心所欲地拥有多个elseif,但else必须排在最后。就这样。好的。

  • 类声明

    如上所述,类声明中不能有控制语句:好的。

    1
    2
    3
    4
    class xyz {
        if (true) {
            function ($var) {}
        }

    在这种情况下,您要么忘记了函数定义,要么过早地关闭了一个}。好的。

  • 意外的其他

    混合php和html时,if/elseif的结束}必须与下一个elseif/else位于同一php块中。这将产生错误,因为关闭if}需要是elseif的一部分:好的。

    1
    2
    3
    4
    5
    6
    <?php if ($x) { ?>
        html
    <?php } ?>
    <?php elseif ($y) { ?>
        html
    <?php } ?>

    正确的格式:好的。

    1
    2
    3
    4
    5
    <?php if ($x) { ?>
        html
    <?php } elseif ($y) { ?>
        html
    <?php } ?>

    这或多或少是不正确缩进的一种变化——大概是基于错误的编码意图。您不能在ifelseifelse结构令牌之间混用其他语句:好的。

    1
    2
    3
    4
    5
    6
    7
    8
    if (true) {
    }
    echo"in between";    ←
    elseif (false) {
    }
    ?> text <?php      ←
    else {
    }

    两者都只能出现在{…}代码块中,而不能出现在控制结构标记之间。好的。

    • 不管怎么说,这是不合理的。当php在ifelse分支之间跳转时,并不是有"未定义"的状态。
    • 您必须决定打印语句属于/或是否需要在两个分支中重复。

    也不能在不同的控制结构之间划分if/else:好的。

    1
    2
    3
    4
    foreach ($array as $i) {
        if ($i) {}
    }
    else {}

    ifelse之间没有句法关系。foreach的词汇量范围以}结尾,因此if结构没有继续的意义。好的。

  • TyEndif

    如果有人抱怨意外的t结尾,您使用的是可选的语法样式if:elseif:号?else:号?埃多克斯1〔27〕。你真的应该三思而后行。好的。

    • 一个常见的陷阱是混淆了与;分号极其相似的:冒号。(见"分号太早")。好的。

    • 由于缩进在模板文件中很难跟踪,因此在使用替代语法时,越可能您的endif;与任何if:都不匹配。好的。

    • 使用} endif;。是一个双重的if终止符。好的。

    而"意料之外的$end"通常是忘记收市的}花括号的价格。好的。

  • 任务与比较

    因此,这不是语法错误,但在本文中值得一提:好的。

    1
    2
    3
           ?
    if ($x = true) { }
    else { do_false(); }

    这不是一个==/===比较,而是一个=分配。这是相当微妙的,很容易导致一些用户无助地编辑整个条件块。当心意外的任务,首先-当你遇到一个逻辑错误/错觉。好的。

  • 好啊。


    意外TyIF意外的t ou foreach意外的tu意外的时间意外Tydoo意想不到的T_回声

    控制结构如ifforeachforwhilelistglobalreturndoprintecho只能用作语句。他们通常一个人住在一条线上。

  • 分号;你在哪里?

    如果解析器抱怨控制语句,那么您是否在前一行中遗漏了分号?

    1
    2
    3
                 ?
    $x = myfunc()
    if (true) {

    解决方案:查看前一行;添加分号。

  • 类声明

    发生这种情况的另一个位置是在类声明中。在类部分中,只能列出属性初始化和方法部分。不允许存在代码。

    1
    2
    3
    class xyz {
        if (true) {}
        foreach ($var) {}

    这种语法错误通常会出现在嵌套不正确的{}中。尤其是当函数代码块过早关闭时。

  • 表达式上下文中的语句

    大多数语言结构只能用作语句。它们不应该放在其他表达式中:

    1
    2
                       ?
    $var = array(1, 2, foreach($else as $_), 5, 6);

    同样,您不能在字符串、数学表达式或其他地方使用if

    1
    2
    3
                   ?
    print"Oh," . if (true) {"you!" } ." won't work";
    // Use a ternary condition here instead, when versed enough.

    对于在表达式中嵌入if样条件,通常需要使用?:三元计算。

    这同样适用于forwhileglobalecho和较小范围的list

    1
    2
              ?
    echo 123, echo 567,"huh?";

    print()是一种内置的语言,可以在表达式上下文中使用。(但很少有意义。)

  • 保留关键字作为标识符

    对于用户定义的函数或类名,也不能使用doif等语言构造。(可能在pH7.但即使这样也不可取。)


  • 意外的t_等于意外的t_大于或等于意外的t_相同意外的t不等于意外的t_不相同意外的t_小于或等于意外的<。意外的>

    比较运算符,如==>====!=<>!==<=<>主要应用于表达式,如if表达式。如果解析器抱怨它们,那么通常意味着它们周围的()pares不正确或不匹配。

  • 父母分组

    尤其是对于具有多重比较的if语句,必须注意正确计算左括号和右括号:

    1
    2
    3
                            ?
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          ↑

    这里的if条件已经被)终止了。

    一旦您的比较变得足够复杂,通常会有助于将其拆分为多个嵌套的if结构。

  • isset()与比较混合

    一个常见的新来者是Pitfal试图将isset()empty()与比较相结合:

    1
    2
                            ?
    if (empty($_POST["var"] == 1)) {

    甚至:

    1
    2
                        ?
    if (isset($variable !=="value")) {

    这对PHP没有意义,因为issetempty是只接受变量名的语言构造。比较结果也没有意义,因为输出只是/已经是一个布尔值。

  • 混淆>=大或等于=>数组运算符

    两个操作符看起来有些相似,因此有时会混淆:

    1
    2
             ?
    if ($var => 5) { ... }

    您只需要记住这个比较运算符被称为"大于或等于"就可以正确地进行比较。

    另请参见:PHP中的if语句结构

  • 没什么可比的

    如果两个比较属于同一个变量名,则也不能组合使用:

    1
    2
                     ?
    if ($xyz > 5 and < 100)

    PHP无法推断您打算再次比较初始变量。表达式通常根据运算符优先级配对,因此当看到<时,只剩下原始变量的布尔结果。

    另请参见:意外的t_小于或等于

  • 比较链

    不能将变量与一行运算符进行比较:

    1
    2
                      ?
     $reult = (5 < $x < 10);

    这必须分成两个比较,分别与$x进行比较。

    这实际上更像是黑名单表达式(由于等价的运算符关联性)。在一些C样式的语言中,它在语法上是有效的,但是PHP也不会将其解释为预期的比较链。

  • 意外的>意外的<

    大于>或小于<的运算符没有自定义T_XXX标记器名称。虽然它们可以像其他的一样放错地方,但您经常会看到解析器抱怨它们的错误引用字符串和混合HTML:

    1
    2
    3
                            ?
    print"Hello";
                     ↑

    这相当于一个字符串"被比较>到一个文字常量Hello,然后另一个<比较。或者至少这是PHP看到的。实际原因和语法错误是字符串"过早终止。

    也不可能嵌套php start标记:

    1
    2
    <?php echo <?php my_func(); ?>
               ↑
  • 参见:

    • php意外的t_is_not_equal错误
    • 语法错误,意外的t_等于
    • RETURN语句语法错误
    • http://forums.phpfreaks.com/topic/96891-parse-error-syntax-error-unexpected-t-is-not-identifier-expecting-or/


    "未被发现"?(P)如果你尝试使用无主控制操作程序EDOCX1的英文本16,在一个版本的PHP prior to PHP 7中,你会得到这个错误。(p)字母名称"未被发现"?预期变量(P)类似的错误可以为无效类型,包括:(p)字母名称(P)Which again indicates an outdated php version being used(either the cli version EDOCX1 original 17 or the webserver bound one EDOCX1 universifical 18).(p)


    Unexpected T.-lnumber(P)The Token EDOCX1 English 0 refers to a long/number.(p)

  • 无效变量名称(P)In php,and most other programming languages,variables cannot start with a number.第一个特点必须是Alphabetic或是Undersecre。(p)字母名称(P)字母名称(p)
    • (P)Quite often comes up for using EDOCX1 plus 1-placeholders EDOCX1 plus 2 in php_context:(p)字母名称(P)Where the callback should have been quoted.(Now the EDOCX1 theography 3 common regex flag has been depressed.But it's sometimes still misused in EDOCX1 plication 4 communal functions.)(p)
    • (P)The same identifier constraint applies to object properties,BTW.(p)字母名称
    • (P)While the Tokenizer/Parser does not allow a逐字逐句EDOCX1/音标5 as variable name,one could use EDOCX1/音标6 or EDOCX1/音标7.Which is a syntactic workound for non-standard identifiers.(It's best to think of it a s a local scope look up.But generally:prefer plain arrays for such cases!(p)
    • (P)Amusingly,but very much not recommended,PHPS parser allows unicode-identifiers;such that EDOCX1 simplifical 8 would be valid.(Unlike a逐字逐句EDOCX1)(p)
  • Stray Array Entry(P)An unexpected long can also occur for array declarations-when missing EDOCX1(p)字母名称(P)Or like function calls and declarations,and other constructs:(p)
    • 字母名称
    • 字母名称
    • 字母名称

    (P)So usually there's one of EDOCX1 literal 14 common or EDOCX1 big 10 communal missing for separating lists or expressions.(p)

  • Misquoted HTML(P)and again,misquoted strings are a frequent source of stray numbers:(p)字母名称(P)这类案件应当受到更多的待遇,或不象未被揭露的那样受到惩处。(p)
  • Other identifiers(P)Neither functions,classes,nor names can be named beginning with a number either:(p)字母名称(P)已新增此相片至他的最爱。(p)

  • Unexpected'.(P)这可能是由于在一个可变名称中保留了无效的特性。变量名称必须遵循这些规则:(p)布尔奇1


    3.Unexpected"continue"(t'uu continue)(P)EDOCX1 19是一个声明(如for,or if)和必须呼吁立场。It cannot be used as part of an expression.Partly because continue doesn't return a value,but in an expression every sub-expression must result in some value so the overall expression results in a value.That's the difference between a statement and an expression.(p)(P)That means EDOCX1 penographic 19 cannot be used in a ternary statement or any statement that requires a return value.(p)Unexpected'break'(t u break)(P)同一天为EDOCX1写一首歌It's also not usable in expression context,but a strict statement(on the same level a s EDOCX1 penographic 22 or an EDOCX1 penographic 23 commock).(p)2.Unexpected'return'(t u return)(P)Now this might be more surprising for EDOCX1 plus 24,but that's also just a block-level statement.It does return a value(or null)to the higher scope/function,but it does not evaluate as expression itself.-那是:在以东没有点-25(p)


    2.Unexpected"endwhile"(t'endwhile)(P)如果有一个以上的错误,就使用一个结肠。(p)字母名称(P)Alternative to this syntax is using curly brackets(p)字母名称(P)http://php.net/manual/en/control-structures.while.php(p)""Owner":"Badge'uu counts":"Bronze":"256","Silver":184,"Gold"?"Reputation":126220,"User"?"UID":345031,"User"?"User"?"Registered","Accept"?"UU Rate":78,"Profile"?"Uimage":"https://www.graftar.com/avatar/b7ec7f22d50EAC79685b08f?"S=128&D=Identicon&R=PG,"Display"UU name:"Mario","Link":"https://stackoverflow.com/users/345031/Mario