【问题标题】:PHP end tag "?>" [duplicate]PHP结束标记“?>” [重复]
【发布时间】:2013-11-26 00:52:51
【问题描述】:

我遇到了一个有趣的现象,即 PHP 结束标记。我有一个由 Ajax 调用执行的 php 文件。在 php 文件中包含一个具有各种功能的 php 库文件。当包含这个库时,php 响应包含一堆空行。当我从库中删除结束标记时,这种情况就停止了。 谁能给我解释一下这里发生了什么?

【问题讨论】:

  • 您可能在 ?> 标记后有一些空行,然后这些空行被解释为空行。当您删除 php 结束标记时,这些行被视为 php 代码,并且空的 php 行不会写入输出缓冲区。
  • 库 PHP 文件在其 ?> 之后有一堆换行符。这些将作为输出直接发送到输出缓冲区,因为它们不会被解释为<?php ?> 中的 PHP 代码。这是“标头已发送”错误的最常见原因,也是许多框架省略?> 的原因。
  • php.net/manual/en/language.basic-syntax.phptags.php "如果文件是纯 PHP 代码,最好在文件末尾省略 PHP 结束标记。这样可以防止在 PHP 结束标记后意外添加空格或新行"
  • 我认为 this response 在另一个类似问题中是一个完美的答案。

标签: php tags


【解决方案1】:

这是有据可查的。来自PHP Manual

文件末尾的 PHP 块的结束标记是可选的,在某些情况下,在使用 include() 或 require() 时省略它会很有帮助,因此文件末尾不会出现不需要的空格,并且稍后您仍然可以向响应中添加标头。如果您使用输出缓冲,它也很方便,并且不希望在包含的文件生成的部分末尾看到添加的不需要的空白。

省略结束标记有助于防止意外的空格或换行符被添加到文件末尾。

【讨论】:

    【解决方案2】:

    这是 PHP 的核心功能:与其他语言不同,您需要使用特殊标记(通常为 <?php)标记 PHP 代码,因为其他所有内容都被视为文字输出:

    This is not PHP
    <?php
    
    echo 'This is PHP' . PHP_EOL;
    
    ?>
    This is not PHP either
    
    D:\tmp>php test.php
    This is not PHP
    This is PHP
    This is not PHP either
    

    尽管有手册 mentions HTML,PHP 并不真正了解/关心其标签之外的内容类型。

    如果您忘记关闭 PHP 块,而后面还有其他内容,您通常会收到语法错误:

    This is not PHP
    <?php
    
    echo 'This is PHP' . PHP_EOL;
    
    This is not PHP either
    
    D:\tmp>php test.php
    PHP Parse error:  syntax error, unexpected 'is' (T_STRING) in D:\tmp\borrame.php on line 6
    

    空行是一种特殊情况,因为它们在几乎所有语言(PHP、HTML、CSS、JavaScript...)中都是有效的并且几乎不可见,因此它们经常被忽视。

    一旦您删除了?&gt; 标记,您的文字空行就会从脚本输出中消失,因为它们已成为 PHP 代码的一部分(因此,它们已开始被忽略)。

    当然,空行会被 PHP 忽略,但不一定会被您生成的任何东西所忽略,正如我所说,它不需要是 HTML:它可以是图片、PDF 文档、Excel 电子表格。通过在文件的最后部分不关闭最后一个 PHP 块,可以轻松避免虚假的白线。

    【讨论】:

    • 今天你无论如何都不应该在你的 php 中使用 echo。指向 MVC、模板系统、框架等。
    猜你喜欢
    • 2012-04-01
    • 1970-01-01
    • 2017-10-04
    • 2011-01-16
    • 2021-06-13
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多