Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么要省略结束标记?_Php_Security_Http Headers - Fatal编程技术网

Php 为什么要省略结束标记?

Php 为什么要省略结束标记?,php,security,http-headers,Php,Security,Http Headers,我一直在读,在文件末尾使用PHP close标记?>是一种糟糕的做法。标题问题在以下上下文中似乎无关紧要(这是迄今为止唯一的好论点): 现代版本的PHP在PHP.ini中设置输出缓冲标志 如果启用了输出缓冲,则可以在输出HTML后设置HTTP头和Cookie,因为返回的代码不会立即发送到浏览器 每一本好的实践书和维基都是从这个“规则”开始的,但没有人给出好的理由。 是否还有另一个跳过结束PHP标记的好理由?它不是一个标记 但如果你有它,你就有可能在它后面留下空白 如果将其用作文档顶部的包含,则可

我一直在读,在文件末尾使用PHP close标记
?>
是一种糟糕的做法。标题问题在以下上下文中似乎无关紧要(这是迄今为止唯一的好论点):

现代版本的PHP在PHP.ini中设置输出缓冲标志 如果启用了输出缓冲,则可以在输出HTML后设置HTTP头和Cookie,因为返回的代码不会立即发送到浏览器

每一本好的实践书和维基都是从这个“规则”开始的,但没有人给出好的理由。 是否还有另一个跳过结束PHP标记的好理由?

它不是一个标记

但如果你有它,你就有可能在它后面留下空白


如果将其用作文档顶部的包含,则可能会在尝试发送HTTP头之前插入空白(即内容),这是不允许的。

我知道原因,但我无法显示:

对于只包含PHP代码的文件,结束标记(
?>
)永远不会被删除 被允许PHP不需要它, 省略它可以防止 意外注入尾随白细胞 将空格插入到响应中


来源:

不让结束语
?>
进入非常有用

该文件对PHP保持有效(不是语法错误),正如@David Dorward所说,它允许避免在
?>
之后出现空格/换行符(任何可以向浏览器发送头的内容)

比如说,

<?
    header("Content-type: image/png");
    $img = imagecreatetruecolor ( 10, 10);
    imagepng ( $img);
?>
[space here]
[break line here]

[此处空格]
[此处换行]
无效

但是


您应该省去php结束标记(
?>
)的原因是程序员不会意外地发送额外的换行符


您不应该省略php结束标记的原因是,它会导致php标记中的不平衡,任何有半点想法的程序员都可以记住不要添加额外的空格

关于你的问题:


是否还有另一个跳过结束php标记的好理由

不,没有其他好的理由跳过结束的php标记

最后,我将介绍一些不必使用结束标记的理由:

  • 人们总是会犯错误,不管他们多么聪明。 坚持减少可能错误数量的实践是一个好主意

  • PHP不是XML。PHP不需要遵守XMLs严格的标准,就可以编写良好并实现功能。如果一个丢失的结束标记让你烦恼,你可以使用一个结束标记,这不是一个固定的规则


  • 嗯,有两种方式来看待它

  • PHP代码只不过是一组,因此任何带有
    .PHP
    扩展名的文件只不过是一个XML文件,它恰好被解析为PHP代码
  • PHP恰好为其打开和关闭标记共享XML处理指令格式。基于此,扩展名为
    .php
    的文件可能是有效的XML文件,但不一定是有效的
  • 如果您相信第一条路径,那么所有PHP文件都需要结束标记。忽略它们将创建一个无效的XML文件。同样,如果没有打开的
    声明,您将不会有有效的XML文件。。。所以这不是一个大问题

    如果您相信第二种方法,则为两种类型的
    .php
    文件打开了大门:

    • 仅包含代码的文件(例如库文件)
    • 包含本机XML和代码的文件(例如模板文件)
    基于此,只有代码的文件可以结束,而无需关闭
    ?>
    标记。但是,如果不关闭
    ?>
    ,XML代码文件就不能结束,因为这会使XML无效

    但我知道你在想什么。你在想这有什么关系,你永远不会直接呈现一个PHP文件,所以谁在乎它是否是有效的XML。好吧,如果你在设计一个模板,这是很重要的。如果它是有效的XML/HTML,普通浏览器将不会显示PHP代码(它被视为注释)。因此,您可以模拟出模板,而无需在

    我不是说这很重要。这只是一个我并不经常看到的观点,所以有什么更好的地方来分享它


    就我个人而言,我不会关闭库文件中的标记,但会关闭模板文件中的标记。。。我认为这是一个基于个人偏好(和编码指南)的建议,而不是任何硬性的建议…

    这是一个新手编码风格的建议,是出于善意的建议

    • 然而,避免使用
      ?>
      只会解决常见问题(原始输出、通知等)及其后续问题

    • PHP实际上包含了一些魔法,可以在
      ?>
      结束标记后吃掉单个换行符。尽管如此,新来者仍然容易受到不可靠的编辑器的影响,并且在
      ?>
      之后毫不留情地在其他空格中移动

    • 从风格上讲,一些开发人员更喜欢将
      视为SGML标记/XML处理指令,这意味着尾随结束标记的平衡一致性。(顺便说一句,对于依赖项连接类来说非常有用,它包括通过文件自动加载取代低效的文件。)


    • 如果我正确理解了这个问题,那么开头的
      就有点不寻常了,它与输出缓冲以及这可能对结束/结束标记产生的影响有关。我不确定这是一个完全正确的问题。问题在于,输出缓冲区并不意味着所有内容在发送到客户端之前都保存在内存中。这意味着一些内容是

      程序员可以有目的地刷新缓冲区或输出缓冲区。那么PHP中的输出缓冲区选项真的会改变结束标记对编码的影响吗?我认为事实并非如此

      也许这就是为什么大多数答案都回到了那个人身上
      <?
          header("Content-type: image/png");
          $img = imagecreatetruecolor ( 10, 10 );
          imagepng ( $img );
      
      __HALT_COMPILER();
      ?>
      
      [core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11)