Heim  >  Fragen und Antworten  >  Hauptteil

PHP-Parsing-/Syntaxfehler; und wie man sie behebt

<p>Jeder stößt auf Grammatikfehler. Selbst erfahrene Programmierer machen Fehler. Für Neulinge ist dies nur ein Teil des Lernprozesses. Allerdings sind Fehlermeldungen meist leicht zu interpretieren, zum Beispiel: </p> <blockquote> <p>PHP-Parsing-Fehler: Syntaxfehler, unerwartetes „{“ in index.php Zeile 20</p> </blockquote> <p>Unerwartete Symbole sind nicht immer der wahre Übeltäter. Aber die Zeilennummer gibt eine ungefähre Vorstellung davon, wo man mit der Suche beginnen sollte. </p> <blockquote> <p>Achten Sie immer auf den <strong>Codekontext</strong>. Syntaxfehler werden oft in <em> oder </em> versteckt, die in <strong>der vorhergehenden Codezeile erwähnt werden. Vergleichen Sie Ihren Code mit den Syntaxbeispielen im Handbuch. </p> </blockquote> <p>Obwohl nicht alle Fälle miteinander übereinstimmen. Es gibt jedoch einige allgemeine Schritte zum <strong>Beheben von Syntaxfehlern</strong>.Diese Referenz fasst häufige Fallstricke zusammen: </p> <ul> <li><p>Unerwarteter T_STRING</p> </li> <li><p>Unerwartete T_VARIABLE </p><p> Unerwartetes '$varname' (T_VARIABLE)</p> </li> <li><p>Unerwartetes T_CONSTANT_ENCAPSED_STRING </p><p>Unerwartetes T_ENCAPSED_AND_WHITESPACE</p> </li> <li><p>Unerwartetes $end</p> </li> <li><p>Unerwartete T_FUNCTION...</p> </li> <li><p>Unerwartet<code>{</code></p><p>Unerwartet<code>}</code></p><p> Unerwartet<code> (</code></p><p>Unerwartet<code>)</code></p> </li> <li><p>Unerwartet<code>[</code></p><p>Unerwartet<code>]</code></p> </li> <li><p>Unerwartetes T_IF </p><p> Unerwartetes T_FOREACH </p><p> Unerwartetes T_WHILE </ p>< p> Unerwartetes T_DO </p><p> </li> <li><p>Unerwartete T_LNUMBER</p> </li> <li><p>Unfall?</p> </li> <li><p>Unerwartete Fortsetzung (T_CONTINUE)</p><p>Unerwartete Fortsetzung (T_BREAK)</p><p>Unerwartete Fortsetzung (T_RETURN)</p> </li> <li><p>Unerwartetes "="</p> </li> <li><p>Unerwartetes T_INLINE_HTML…</p> </li> <li><p>Unerwartetes T_THIS_IS_THE_THING...</p> </li> <li><p>Unerwarteter T_OBJECT_OPERATOR...</p> </li> <li><p>Unerwarteter T_DOUBLE_ARROW...</p> </li> <li><p>Unerwartetes T_SL...</p> </li> <li><p>Unerwartetes T_BOOLEAN_OR… </p><p> Unerwartetes T_BOOLEAN_AND…</p> </li> <li><p>Unerwartetes T_IS_EQUAL </p><p> Unerwartetes T_IS_GREATER_OR_EQUAL </p><p> Unerwartetes T_IS_IDENTICAL </p><p> Unerwartetes T_IS_NOT_EQUAL </p><p> Unerwartetes T_IS_NOT_IDENTICAL </p><p> Unerwartetes T_IS_SMALLER_OR_EQUAL </p><p> Unerwartetes <code><</code> </p><p> Unerwartetes <code>></code></p> </li> <li><p>Unerwarteter T_NS_SEPARATOR...</p> </li> <li><p>Unerwartete Zeichen in der Eingabe: '<code></code> (ASCII=92) state=1</p> </li> <li><p>Unerwartet 'Öffentlich' (T_PUBLIC) </p><p>Unerwartet 'Privat' (T_PRIVATE) </p><p>Unerwartet 'Geschützt' (T_PROTECTED) ) < /p><p>Unerwartetes 'T_FINAL'...</p> </li> <li><p>Unerwartetes T_STATIC...</p> </li> <li><p>Unerwartete T_CLASS…</p> </li> <li><p>Unerwartete 'Verwendung' (T_USE)</p> </li> <li><p>Unerwartete T_DNUMBER</p> </li> <li><p>Unerwartetes <code>,</code> <em>(Komma)</em></p> </li> <li><p>Unerwarteter<Code>.</code> <em>(Punkt)</em></p> </li> <li><p>Unerwartetes <code>;</code> <em>(Semikolon)</em></p> </li> <li><p>Unerwartet<code>*</code><em> (Sternchen)</em></p> </li> <li><p>Unerwartet<code>: </code><em></em></p> </li> <li><p>Unerwartetes ':', erwartetes ',' oder ')'</p> </li> <li><p>Unerwarteter<code>&</code> (wird beim Aufruf als Referenz übergeben)</p> </li> <li><p>Unerwarteter<Code>. </code></p> </li> </ul> <p>Verwandte Referenzen:</p> <ul> <li>Was bedeutet dieser Fehler in PHP? (Laufzeit Fehler) <ul> <li>Analysefehler: Syntaxfehler, unerwartetes T_XXX</li> <li>Analysefehler: Syntaxfehler, unerwartetes T_ENCAPSED_AND_WHITESPACE</li> <li>Analysefehler: Syntaxfehler, unerwartete T_VARIABLE</li> </ul> </li> <li>Was bedeutet dieses Symbol in PHP? (Sprach-Tag)</li> <li>Diese<code>""</code>smart<code>''</code>Anführungszeichen bedeuten für PHP nichts</li> </ul> <p>Auch:</p> <ul> <li>PHP-Handbuch und seine verschiedenen Sprach-Tags auf php.net</li> <li>Oder Wikipedias Syntax-Einführung in PHP. </li> <li>Zu guter Letzt ist natürlich noch unser <strong>php</strong> </li> </ul> <p>Obwohl Stack Overflow Programmieranfänger willkommen heißt, ist es in erster Linie auf professionelle Programmierfragen ausgerichtet. </p> <ul> <li>Beantworten Sie alle Codierungsfehler und engen Rechtschreibfehler, die meist als nicht zum Thema gehörend angesehen werden. </li> <li>Bevor Sie also eine Anfrage zur Syntaxkorrektur veröffentlichen, nehmen Sie sich bitte etwas Zeit, um die grundlegenden Schritte auszuführen. </li> <li>Wenn Sie dies noch tun müssen, zeigen Sie Ihre eigene Lösung, Ihren Korrekturversuch und Ihren Denkprozess für das, was ein Fehler zu sein scheint oder ein Fehler sein könnte.</li> </ul> <p>Wenn Ihr <em>Browser</em> eine Fehlermeldung wie „SyntaxError: illegales Zeichen“ anzeigt, dann handelt es sich nicht um einen PHP-bezogenen Fehler, sondern um einen Javascript-Syntaxfehler. </p> <hr /> <p><strong>Syntaxfehler, die durch Herstellercode ausgelöst werden:</strong>Bedenken Sie abschließend, dass der Syntaxfehler nicht durch Bearbeiten der Codebasis, sondern nach der Installation oder Aktualisierung eines externen Anbieterpakets ausgelöst wird , es liegt möglicherweise eine Inkompatibilität aufgrund der PHP-Version vor. Überprüfen Sie daher die Anforderungen des Anbieters anhand Ihrer Plattformeinstellungen. </p>
P粉633075725P粉633075725446 Tage vor624

Antworte allen(2)Ich werde antworten

  • P粉639667504

    P粉6396675042023-08-24 12:44:02

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

    使用语法检查 IDE 意味着:

    您将(有效地)再也不会遇到语法错误,因为您在键入时就可以正确地看到它们。说真的。

    具有语法检查功能的优秀 IDE(所有这些都适用于 Linux、Windows 和 Mac):

    1. NetBeans [免费]
    2. PHPStorm [199 美元]
    3. EclipsePHP 插件 [免费]
    4. Sublime [80 美元](主要是一个文本编辑器,但可通过插件扩展,例如 PHP 语法解析器)

    Antwort
    0
  • P粉068510991

    P粉0685109912023-08-24 09:05:03

    什么是语法错误?

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

    最重要的提示

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

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

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

    • 阅读手册中的语言参考和示例。 两次,就熟练了。

    如何解释解析器错误

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

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

    诸如T_STRING之类的名字解释了解析器/标记器无法解析的符号最后处理。然而,这不一定是语法错误的原因。

    查看以前的代码行也很重要。通常,语法错误只是之前发生的意外。错误行号正是解析器最终放弃处理所有内容的位置。

    解决语法错误

    有很多方法可以缩小范围并修复语法问题。

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

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

      • 从左到右阅读该行并想象每个符号的作用。

    • 您还需要更频繁地查看前面的行

      • 特别是,上一行结尾/语句处缺少 ; 分号。 (至少从风格的角度来看。)

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

    • 看看语法着色

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

      • 运算符+-*/. 也应该着色不同。否则他们可能处于错误的环境中。

      • 如果您发现字符串着色延伸得太远或太短,则说明您发现了未转义或丢失的结束 "' 字符串标记。

      • 两个相邻的相同颜色的标点符号也可能意味着麻烦。通常,如果运算符后面不是 ++-- 或括号,则运算符是单独的。在大多数情况下,两个直接相连的字符串/标识符是不正确的。

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

    • 暂时打破长队。

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

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

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

      • 在以下位置之间添加换行符:

        1. 您可以轻松识别正确的代码,
        2. 您不确定的部分,
        3. 以及解析器抱怨的行。

        对长代码块进行分区确实有助于定位语法错误的根源。

    • 注释掉违规代码。

      • 如果无法隔离问题根源,请开始注释掉(从而暂时删除)代码块。

      • 一旦解决了解析错误,您就找到了问题根源。仔细看看那里。

      • 有时您想暂时删除完整的函数/方法块。 (如果出现不匹配的大括号和错误缩进的代码。)

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

    • 作为新手,请避免一些令人困惑的语法结构。

      • 三元? : 条件运算符可以压缩代码并且确实很有用。但它并不能在所有情况下提高可读性。在不熟悉的情况下更喜欢简单的 if 语句。

      • PHP 的替代语法 (if:/elseif:/endif;) 对于模板来说很常见,但可以说不太容易遵循正常的 { 代码 } 块。

    • 新手最常见的错误是:

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

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

      • 被遗忘的运算符,特别是字符串 . 连接。

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

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

      • 如果您解决了一个问题,但下面的某些代码中出现了其他问题,那么您基本上就走在正确的道路上了。

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

    • 如果无法修复,请恢复之前工作代码的备份。

      • 采用源代码版本控制系统。您始终可以查看损坏版本和最后工作版本的差异。这可能有助于了解语法问题是什么。
    • 看不见的杂散 Unicode 字符:在某些情况下,您需要在源代码上使用十六进制编辑器或其他编辑器/查看器。有些问题仅仅通过查看代码是无法发现的。

    • 注意文件中保存的换行符类型

      • PHP 仅支持 \n 换行符,而不支持 \r 回车符。

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

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

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

      • 您正在查看错误的文件!

      • 或者您的代码包含不可见的杂散 Unicode(见上文)。 您可以轻松发现:只需将代码从网络表单复制回文本编辑器即可。

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

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

      • 用于通过网络服务器调用。


      这些不一定相同。特别是在使用框架时,您需要将它们匹配起来。

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

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

    如果所有其他方法都失败,您可以随时google您的错误消息。语法符号不太容易搜索(尽管 Stack Overflow 本身是通过 SymbolHound 进行索引的)。因此,您可能需要再浏览几页才能找到相关内容。

    更多指南:

    白屏死机

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

    • error_reporting = E_ALL
    • display_errors = 1

    在您的php.ini一般来说,或者通过 mod_php 的 .htaccess , 甚至 .user.ini使用 FastCGI 设置。

    在损坏的脚本中启用它为时已晚,因为 PHP 甚至无法解释/运行第一行。一个快速的解决方法是制作一个包装脚本,例如 test.php

    <?php
       error_reporting(E_ALL);
       ini_set("display_errors", 1);
       include("./broken-script.php");

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

    它还有助于启用 PHP 的 error_log 并查看您的网络服务器的error.log 当脚本因 HTTP 500 响应而崩溃时。

    Antwort
    0
  • StornierenAntwort