我什么时候使用PHP常量"PHP_EOL"?

Chr*_*ard 347 php eol

什么时候使用是个好主意PHP_EOL

我有时会在PHP的代码示例中看到这一点.这会处理DOS/Mac/Unix终结问题吗?

Ada*_*ire 347

是的,PHP_EOL表面上用于以跨平台兼容的方式查找换行符,因此它处理DOS/Unix问题.

请注意,PHP_EOL表示当前系统的结束字符.例如,在类似unix的系统上执行时,它不会找到Windows端线.

  • 它是否应该在编写命令行脚本时用作结束字符? (8认同)
  • @Andre:那些编写应用程序以供其他人安装,使用和部署的人怎么样?您是否建议将这些"受支持的平台"限制为*nix? (5认同)
  • 不,我不认为你的答案是正确的.您在一个系统上生成代码,但将输出发送到另一个系统.但是,PHP_EOL会告诉您仅使用它的系统的行结束分隔符.它不保证您的其他系统使用相同的分隔符.请参阅下面的答案. (5认同)
  • @Thomas:是的.C",) (4认同)
  • @斯坦恩-您所知道的“大项目”做什么几乎不是最佳实践的决定因素,更不用说什么有用或没用了。我维护一个“大项目”,部分部署在多个主机上,包括一些 Windows 服务器。不要假设——这些常量不会造成任何损害,并且是编写与平台无关的代码的完全有效的方法。你的相反评论有些荒谬。 (2认同)

Ale*_*exV 87

main/php.hPHP版本7.1.1和版本5.6.30:

#ifdef PHP_WIN32
#   include "tsrm_win32.h"
#   include "win95nt.h"
#   ifdef PHP_EXPORTS
#       define PHPAPI __declspec(dllexport)
#   else
#       define PHPAPI __declspec(dllimport)
#   endif
#   define PHP_DIR_SEPARATOR '\\'
#   define PHP_EOL "\r\n"
#else
#   if defined(__GNUC__) && __GNUC__ >= 4
#       define PHPAPI __attribute__ ((visibility("default")))
#   else
#       define PHPAPI
#   endif
#   define THREAD_LS
#   define PHP_DIR_SEPARATOR '/'
#   define PHP_EOL "\n"
#endif
Run Code Online (Sandbox Code Playgroud)

正如你可以看到PHP_EOL可以"\r\n"(在Windows服务器上)或"\n"(在其他东西).在5.4.0RC8 之前的 PHP版本上,可能有以下第三个值PHP_EOL:( "\r"在MacOSX服务器上).这是错误的,已在2012-03-01 修复,错误61193.

正如其他人已经告诉过你的那样,你可以使用PHP_EOL任何类型的输出(其中任何一个值都是有效的 - 比如:HTML,XML,日志...),你需要统一的换行符.请记住,它是确定价值的服务器,而不是客户端.您的Windows访问者将从您的Unix服务器获得价值,这有时对他们来说是不方便的.

我只是想显示PHP_EOLPHP源支持的可能值,因为它还没有在这里显示...

  • @ imgx64也许,但老实说你见过生产MAC服务器吗? (24认同)
  • 哇.PHP开发人员对此非常不对.作为维基百科链接,您提到了Mac OS 9,之前使用的是"\ r",而不是OS X,它使用"\n".有人应该提交错误报告...... (3认同)
  • @ imgx64它已经修复了你的帖子后33天:)我已经更新了我的答案以反映当前的来源. (3认同)
  • 我认为将PHP_EOL用于输出(!)的参数无效。PHP_EOL是服务器端的,而输出通常用于客户端(使用不同的行尾定界符)。示例:如果您在Linux系统上使用PHP_EOL创建多行纯文本输出并将其发送到Windows系统,则该行将不是有效的行结束定界符-它取决于将显示输出的客户端软件。浏览器和某些文本编辑器可能会处理它,但是例如,如果您在记事本中查看文本,则所有内容都将在一行中。 (2认同)

Zor*_*che 80

PHP_EOL当你想要一个新的线路时,你可以使用,并且想要跨平台.

这可能是您将文件写入文件系统(日志,导出,其他).

如果您希望生成的HTML可读,则可以使用它.所以,你可以按照你的<br />一个PHP_EOL.

如果你从cron运行php作为脚本,你会使用它,你需要输出一些东西,并将其格式化为一个屏幕.

如果要构建要发送的电子邮件,则可以使用它,这需要一些格式化.

  • **`PHP_EOL`不应该用于分隔电子邮件标题.**根据[PHP Mail](http://www.php.net/manual/en/function.mail.php)手册,应该有多个额外的标题用CRLF分隔(\ r \n). (48认同)
  • 生成HTML时,您不需要使用与平台无关的换行符. (24认同)
  • @Zoredache - HTML将使用适合运行PHP的平台的换行符生成,不一定适合您正在访问页面的平台. (14认同)
  • @Rob,如果IE的旧版本给了我一个更好的页面源查看器,那么Windows记事本我可能已经同意了你. (6认同)
  • +1提及电子邮件建立`$ header ="From:$ from".PHP_EOL; $ header.="回复:$ from".PHP_EOL; $ header.="Return-Path:$ from".PHP_EOL;` (2认同)
  • @ Lexib0y TLDR; 不,使用CRLF.你的意思是PHP_EOL,对吗?根据最新的[RFC](http://tools.ietf.org/html/rfc5322#section-2.3),没有.你也应该在那里使用CRLF.但是,即使您使用PHP_EOL(仅在Windows上使用CRLF,在大多数其他服务器上使用LF),各种电子邮件服务器和客户端也可能看起来容忍,但我仍然不会依赖它们. (2认同)
  • `你可以使用它,如果你在那里建立一个需要一些格式化的电子邮件.大声笑这是一个可怕的例子,好像收件人一定会使用相同的操作系统. (2认同)

Sal*_*n A 19

PHP_EOL(string)此平台的正确"End Of Line"符号.从PHP 4.3.10和PHP 5.0.2开始提供

当您在服务器的文件系统上读取或写入文本文件时,可以使用此常量.

在大多数情况下,行结尾无关紧要,因为大多数软件都能够处理文本文件,无论其来源如何.你应该与你的代码保持一致.

如果行结尾很重要,请明确指定行结尾而不是使用常量.例如:

  • HTTP标头必须用\n分隔\r\n
  • CSV文件应该使用\r\n作为行分隔符

  • "HTTP标题必须是......"的来源:https://www.ietf.org/rfc/rfc2616.txt第4章第1节 (5认同)
  • [SMTP](/sf/answers/431790341/)消息行_must_由`\ r \ n`终止 (2认同)

Iai*_*ins 12

我想提出一个答案,解决"何时使用它",因为它还没有被覆盖,可以想象它被盲目使用,没有人注意到有问题直到后来的线路.其中一些与某些现有答案相矛盾.

如果输出到HTML中的网页,特别是文本<textarea>,<pre>或者<code>您可能总是想要使用\n而不是PHP_EOL.

这样做的原因是,虽然代码可能在一个服务器上运行良好 - 这恰好是一个类Unix的平台 - 如果部署在Windows主机(如Windows Azure平台)上,那么它可能会改变某些浏览器中页面的显示方式(特别是Internet Explorer - 其中一些版本将同时看到\n和\ r).

我不确定自IE6以来这是否仍然是一个问题,所以它可能是没有实际意义但似乎值得一提,如果它有助于人们提示考虑上下文.可能还有其他情况(例如严格的XHTML)\r在某些平台上突然输出可能会导致输出问题,我确信还有其他类似的边缘情况.

正如有人已经指出的那样,在返回HTTP标头时你不想使用它 - 因为它们应该始终遵循任何平台上的RFC.

我不会将它用于CSV文件上的分隔符(正如有人建议的那样).服务器运行的平台不应确定生成或使用的文件中的行结尾.


Sta*_*anE 10

不,PHP_EOL不处理最终问题,因为您使用该常量的系统与您将输出发送到的系统不同.

我不建议使用PHP_EOL.Unix/Linux使用\n,MacOS/OS X也从\ r更改为\n,在Windows上,许多应用程序(尤其是浏览器)也可以正确显示它.在Windows上,它也很容易改变现有的客户端代码只使用\n并仍然保持向后兼容性:只需将行修剪的分隔符从\ r \n更改为\n并将其包装在trim()函数中.

  • 很高兴知道为什么我的答案被低估了......疯狂......接受的答案是错误的*,而我的答案是正确的.说PHP_EOL处理问题通常是不正确的.如果在*相同*系统中读取或写入SOLELY内容,它可以(并且应该)使用.但大多数情况下,PHP被用来向客户端发送一些东西(这很可能是提问者想到的).再说一次:PHP_EOL是一个纯粹的服务器端常量.它没有(也不能)正确处理客户端的换行符.如果你认为我写错了,请写评论告诉我. (3认同)
  • +1是为了对抗谷物的好点.我认为它丢失了,因为浏览器不会在html中呈现空白,因此通常用于控制台应用程序.正如您所说,在这种情况下,行结束将被解释为执行环境,这对于控制台应用程序而言是有意义的,但对于客户端 - 服务器Web应用程序则没有意义. (3认同)

小智 9

我发现PHP_EOL对于文件处理非常有用,特别是如果您要将多行内容写入文件中.

例如,您有一个长字符串,您希望在写入普通文件时分成多行.使用\ r \n可能无法正常工作,所以只需将PHP_EOL放入脚本中,结果就很棒了.

看看下面这个简单的例子:

<?php

$output = 'This is line 1' . PHP_EOL .
          'This is line 2' . PHP_EOL .
          'This is line 3';

$file = "filename.txt";

if (is_writable($file)) {
    // In our example we're opening $file in append mode.
    // The file pointer is at the bottom of the file hence
    // that's where $output will go when we fwrite() it.
    if (!$handle = fopen($file, 'a')) {
         echo "Cannot open file ($file)";
         exit;
    }
    // Write $output to our opened file.
    if (fwrite($handle, $output) === FALSE) {
        echo "Cannot write to file ($file)";
        exit;
    }
    echo "Success, content ($output) wrote to file ($file)";
    fclose($handle);
} else {
    echo "The file $file is not writable";
}
?>
Run Code Online (Sandbox Code Playgroud)

  • \n\r将永远不会工作,因为序列是\ r \n </ pedantry> (3认同)

Edw*_*ang 7

PHP_EOL的定义是它为您提供了您正在使用的操作系统的换行符.

在实践中,你几乎从不需要这个.考虑一些情况:

  • 当您输出到Web时,除了您应该保持一致之外,确实没有任何约定.由于大多数服务器都是Unixy,因此无论如何都要使用"\n".

  • 如果您输出到文件,PHP_EOL似乎是个好主意.但是,您可以通过在文件中包含文字换行来获得类似的效果,如果您尝试在Unix上运行某些CRLF格式的文件而不破坏现有的换行符(如同具有双启动系统的人),这将帮助您,我可以说我更喜欢后者的行为)

PHP_EOL是如此荒谬,以至于它真的不值得使用它.

  • -1表示"PHP_EOL太长得太荒谬了".这不是一个有效的论点. (29认同)
  • 我完全同意你的看法。在 *nix 之外的任何地方部署 php 是没有任何意义的。因此 - 使用 PHP_EOL 或 DIRECTORY_SEPARATOR 是没有意义的。 (2认同)
  • @Sajuuk 我相信这会被称为“讽刺”。 (2认同)