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

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

意外的符号并不总是真正的罪魁祸首.但行号给出了从哪里开始寻找的大致概念.

总是看code context.语法错误通常隐藏在previous code lines中提到的or中.将代码与手册中的语法示例进行比较.

但并不是每个 case 都与另一个相匹配.然而,大约有general steps to solve syntax mistakes人.

密切相关的参考文献:

以及:

虽然Stack Overflow也欢迎新手程序员,但它主要针对专业编程问题.

  • 回答每个人的编码错误和狭隘的打字错误被认为基本上是离题的.
  • 因此,在发布语法修复请求之前,请花时间关注basic steps条.
  • 如果你仍然必须这样做,请展示你自己解决问题的主动性、try 的修复方法,以及你对什么看起来或可能是错误的思考过程.

If your browser displays error messages such as "SyntaxError: illegal character", then it's not actually -related, but a -syntax error.


Syntax errors raised on vendor code:最后,考虑如果通过编辑您的代码库而没有提高语法错误,但是在外部供应商包安装或升级之后,可能是由于PHP版本不兼容,所以判断您的供应商对平台设置的要求.

推荐答案

语法错误是什么?

PHP属于C-styleimperative种编程语言.它有严格的语法规则,当遇到放错位置的符号或标识符时无法恢复.它猜不出你的编码意图.

函数定义语法摘要

最重要的提示

以下是一些基本的预防措施:

如何解释解析器错误

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

解析错误:语法错误,意外的T_STRING,在line217上预期file.php中有'100'

其中列出了语法错误的位置.参见上文提到的file nameline number.

moniker(比如T_STRING)解释了解析器/标记器最终无法处理的符号.然而,这并不一定是语法错误的原因.

同样重要的是调查previous code lines人.语法错误通常只是之前发生的意外.错误行号正是解析器最终放弃处理所有错误的地方.

解决语法错误

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

  • 打开提到的源文件.看看前面提到的code line个.

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

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

  • 更经常地,你也需要看preceding lines.

    • 特别是,前一行/语句结尾处缺少;个分号.(至少从文体的Angular 来看.)

    • 如果{个代码块}被错误地关闭或嵌套,您可能需要进一步调查源代码.用适当的方法来简化.

  • 看这syntax colorization块!

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

    • 操作员+-*/.也应该被染成不同的 colored颜色 .否则,他们可能处于错误的环境中.

    • 如果您看到字符串彩色化过长或过短,则表示您发现了未转义或缺少结束的"'字符串标记.

    • 两个相同 colored颜色 的标点符号相邻也可能意味着麻烦.通常,如果运算符后面不是++--或括号,则运算符是孤立的.在大多数上下文中,两个紧跟在后面的字符串/标识符是不正确的.

  • Whitespace is your friend

  • 暂时打散长队.

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

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

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

    • 在以下各项之间添加换行符:

      1. 您可以轻松识别为正确的代码,
      2. 你不确定的部分,
      3. And the lines which the parser complains about.

      划分长代码块really有助于定位语法错误的来源.

  • Comment out个违规代码.

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

    • 一旦您消除了解析错误,您就找到了问题的根源.再仔细看看那里.

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

    • 当你不能解决语法问题时,试着把注释掉的第from scratch节go 掉rewrite.

  • 作为新手,避免一些令人困惑的语法 struct .

    • 三元? :条件运算符可以压缩代码,确实很有用.但它并不能在所有情况下都有助于提高可读性.不懂的时候更喜欢简单的if条语句.

    • PHP的替代语法(if:/elseif:/endif;)在模板中很常见,但可以说不如普通的{代码}块容易遵循.

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

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

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

    • 遗忘的运算符,尤其是字符串.串联.

    • (个括号).在报告行中数一数.他们的人数相等吗?

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

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

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

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

    • Adopt a source code versioning system. You can always view a diff of the broken and last working version. Which might be enlightening as to what the syntax problem is.
  • Invisible stray Unicode characters:在某些情况下,您需要在源代码上添加use a hexeditor个或不同的编辑器/查看器.有些问题仅仅通过查看代码是找不到的.

  • 注意,其中type of linebreaks个保存在文件中.

    • PHP只接受换行符,而不是回车符.

    • Which is occasionally an issue for MacOS users (even on OS  X for misconfigured editors).

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

  • 如果你的syntax error does not transmit over the web:

    • 你看错文件了!

    • 或者您的代码包含不可见的Unicode(见上文).

  • 判断你的PHP version.并非所有的语法 struct 都可以在每台服务器上使用.

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

    • <?php phpinfo();表示通过Web服务器调用的.


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

  • 不要使用PHP's reserved keywords作为函数/方法、类或常量的标识符.

  • 试错是你最后的 Select .

如果所有这些都失败了,您总是可以google您的错误消息.语法符号就不那么容易搜索了(不过,堆栈溢出本身是以SymbolHound为索引的).因此,可能需要再看几页才能找到相关内容.

更多指南:

  • 100大卫·斯卡拉
  • 100杰森·麦克里
  • 100马里奥·卢里格
  • 100
  • 100
  • 100-粉碎杂志

死亡白屏

如果您的网站只是空白,那么通常是语法错误造成的. 通过以下方式启用其显示:

  • error_reporting = E_ALL
  • display_errors = 1

通常是在您的php.ini中,或者对于mod_php是通过.htaccess, 甚至是带有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 Mail到Googlmail.仅SPF

Laravel:替换嵌套路由中的中间件参数

未找到laravel cascadeOnEdit

Symfony Monolog:使用多个格式化程序

PHP php_mongodb.dll for 32bit

如何使用属性#[Embedded]嵌入带有规则的对象集合?

在php中有没有办法比较两个包含相同枚举类型的枚举数组

WooCommerce购物车中仅允许一个可下载产品

在没有谷歌云客户端PHP库的情况下将图像上传到PHP中的Google存储API?

ForHumans函数中的月当量与单位限制

Chillerlan/php-iOS名称字段的QR vCard错误

根据WooCommerce Cart小计阈值自动应用优惠券

对表示大小的值后缀进行自定义排序(XXS、XS、S、M、L、XL、XXL)

在 WooCommerce 中何时何地执行 woocommerce_order_status_completed_notification 挂钩?

Golang - Html 模板:如何创建导航项 - 子菜单?我找不到怎么做

使用 Laravel 和 Vue 进行图像表单验证

php var_dump(1) 返回字符串(4)

MySQLI bind_param导致的Cannot modify readonly property错误

PHP header() 是否缓存重定向,如果是,如何防止它这样做?

如何从此字符串创建 Carbon 对象:2022-06-21T05:52:46.648533678Z?