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

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

评论

我认为在此页面上已投票的答案中有很多令人误解的建议。如果您在两个不同的平台上运行脚本,然后比较输出或生成的数据(日志文件,html页面,数据库记录等),则PHP_EOL将导致差异不匹配。在大多数情况下,这不是您想要的。

#1 楼

是的,表面上可以使用PHP_EOL以跨平台兼容的方式查找换行符,因此它可以处理DOS / Unix问题。请注意,PHP_EOL代表当前系统的结束符。例如,在类似Unix的系统上执行时,它将找不到Windows终端行。

评论


编写命令行脚本时是否应将其用作结束符?

–托马斯·欧文斯(Thomas Owens)
08年9月24日在17:37

@Andre:任何编写要由他人安装,使用和部署的应用程序的人如何?您是否建议这些都应将其“受支持的平台”限制为* nix?

–圆柱体
2011-3-4在10:52

@Stann-您所了解的“大型项目”几乎不是最佳实践的决定因素,更不用说什么是有用的或无用的了。我维护一个“大项目”,该项目部分部署在多个主机上,包括一些Windows服务器。不要假设-常量不会损害任何东西,并且是编写平台无关代码的完美有效方式。您相反的评论有些荒谬。

–克里斯·贝克(Chris Baker)
2012年9月13日19:12



不,我认为您的答案不正确。您在一个系统上生成代码,但是将输出发送到另一个系统。但是,PHP_EOL仅告诉您使用它的系统的行尾定界符。它不能保证您其他系统使用相同的定界符。请参阅下面的答案。

– StanE
15年8月23日在11:43

但不要将PHP_EOL用于从表单发布的数据。

– Nabi K.A.Z.
16年10月10日在10:13

#2 楼

从PHP版本7.1.1和版本5.6.30的main/php.h开始: )。在5.4.0RC8之前的PHP版本上,PHP_EOL可能存在第三个值:"\r\n"(在MacOSX服务器上)。这是错误的,已于2012-03-01修复,错误为61193。

正如其他人已经告诉您的那样,您可以在任何类型的输出中使用"\n"(其中任何这些值均有效-例如:HTML,XML,日志...),您需要统一的换行符。请记住,确定值的是服务器,而不是客户端。您的Windows访问者有时会从Unix服务器上获得价值,这有时对他们来说是不便的。 ...

评论


哇。 PHP开发人员对此是错误的。正如您所提到的Wikipedia链接,Mac OS 9和以前的版本使用的是“ \ r”,而OS X则没有使用“ \ n”。有人应该提交错误报告...

–imgx64
2012年1月28日在7:32

@ imgx64是的,但老实说,您是否见过生产型MAC服务器?

– AlexV
2012年1月30日13:53

@ imgx64它已在您发布33天后修复:)我已经更新了答案,以反映当前消息来源。

– AlexV
13年1月25日在16:33

我认为将PHP_EOL用于输出(!)的参数无效。 PHP_EOL是服务器端的,而输出通常用于客户端(使用不同的行尾定界符)。示例:如果使用PHP_EOL在linux系统上创建多行纯文本输出并将其发送到Windows系统,则该行将不是有效的行尾定界符-它取决于将显示输出的客户端软件。浏览器和某些文本编辑器可能会处理它,但是例如,如果您在记事本中查看文本,则所有内容都将在一行中。

– StanE
15年8月23日在10:47

php -r“ echo addcslashes(PHP_EOL,PHP_EOL),PHP_EOL;”找出答案。

–鲍勃·斯坦(Bob Stein)
17年9月9日在16:04

#3 楼

当您需要换行并希望跨平台时,请使用PHP_EOL

如果希望生成的HTML可读,则可以使用它。因此,您可以在<br />后面加上PHP_EOL。 >
如果您要建立一封电子邮件以发送需要某种格式的邮件,则可以使用它。

评论


生成HTML时不需要使用平台无关的换行符。

–Rob
09年4月21日在22:00

@Rob,如果旧版本的IE给我一个更好的页面源查看器,则我可能已经同意Windows记事本。

– Zoredache
2010年1月23日,1:18

@Zoredache-HTML将使用适合PHP运行的平台的换行符生成,而不一定适合您从中访问页面的平台。

–多米尼克·罗杰(Dominic Rodger)
2010-2-2在8:43

+1表示建立电子邮件$ header =“ From:$ from”。 PHP_EOL; $ header。=““回复至:$ from”。 PHP_EOL; $ header。=“返回路径:$ from”。 PHP_EOL;

–雅各布·科索罗阿巴(Jakob Cosoroaba)
2010年5月17日12:13



PHP_EOL不应用于分隔电子邮件标题。根据PHP Mail手册,应使用CRLF(\ r \ n)分隔多个额外的标头。

–HalilÖzgür
2010-11-27 13:55



#4 楼


PHP_EOL(字符串)
该平台的正确“行尾”符号。
自PHP 4.3.10和PHP 5.0.2起可用


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

在大多数情况下,行尾都无关紧要,因为大多数软件都可以处理文本文件,而不论其来源如何。您应该与代码保持一致。

如果行尾很重要,请显式指定行尾而不是使用常量。例如:


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


评论


“ HTTP标头必须为...”的来源:ietf.org/rfc/rfc2616.txt第4章第1节

– AdrianFöder
16年5月14日在12:02

SMTP邮件行必须以\ r \ n终止

–鲍勃·斯坦(Bob Stein)
17年11月9日在16:12



#5 楼

我想提出一个针对“何时不使用它”的答案,因为它尚未被涵盖,并且可以想象它被盲目地使用了,直到下线才有人注意到这个问题。其中一些与某些现有答案有些矛盾。

如果以HTML输出到网页,尤其是<textarea><pre><code>中的文本,则您可能总是想使用\n而不是PHP_EOL
其原因是,虽然代码可以在一个服务器上正常运行-碰巧是一个类似Unix的平台-如果部署在Windows主机(例如Windows Azure平台)上,则可能会改变页面的显示方式在某些浏览器(特别是Internet Explorer-的某些版本中会同时显示\ n和\ r)中显示。也许还没有定论,但似乎值得一提,它是否可以帮助人们迅速思考环境。可能还有其他情况(例如严格的XHTML),其中在某些平台上突然输出\r可能会导致输出出现问题,我敢肯定还有其他类似情况。已经有人使用,在返回HTTP标头时,您将不希望使用它-因为它们在任何平台上都应始终遵循RFC。

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

#6 楼

我发现PHP_EOL对于文件处理非常有用,特别是如果您要将多行内容写入文件中。普通文件。使用\ r \ n可能无法正常工作,因此只需将PHP_EOL放入脚本中,结果将非常棒。

评论


\ n \ r永远不会起作用,因为该序列本来是\ r \ n

–frak
2010-11-26 12:04

#7 楼

不,PHP_EOL无法处理终端问题,因为使用该常量的系统与将输出发送到的系统不同。

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

评论


很高兴知道我的答案为什么被拒绝...疯狂...接受的答案是错误的,而我的答案是正确的。通常说PHP_EOL处理此问题并不正确。如果在同一系统中唯一地向/从中读取或写入内容,则可以(并且应该)使用它。但是大多数时候,PHP用于将某些内容发送回客户端(这很可能是提问者的想法)。同样:PHP_EOL是纯服务器端常量。它不能(也不能)正确处理客户端换行符。如果您认为我写错了什么,请写评论并告诉我。

– StanE
16年7月10日在17:04

+1是针对谷物的好点子。我认为它已经丢失了,因为浏览器无法在html中呈现空格,因此通常用于控制台应用程序。就像您说的那样,在这种情况下,行尾将针对执行环境进行解释,这对于控制台应用程序有意义,而对客户端-服务器Web应用程序则没有意义。

– Jeff Puckett
16-09-22在12:02

好吧,答案并没有真正的关系。您提到了浏览器兼容性并将文件发送到其他系统。换行符与文本输出相关,因此浏览器不相关。与您的要点相反,这些文本文件通常在与编写它们相同的平台上使用。

– grantwparks
18-10-31在5:03

#8 楼

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

实际上,您几乎永远不需要它。考虑以下几种情况:


输出到Web上时,实际上没有任何约定,只是您应该保持一致。由于大多数服务器都是Unixy,因此无论如何都希望使用“ \ n”。
如果要输出到文件,则PHP_EOL似乎是个好主意。但是,通过在文件中包含文字换行符,可以得到类似的效果,如果您尝试在Unix上运行某些CRLF格式的文件而又不破坏现有的换行符,那么这将为您提供帮助(例如,使用双启动系统的人,我可以说我更喜欢后者的行为)。

PHP_EOL太长了,以至于真的不值得使用它。

评论


-1代表“ PHP_EOL太长了”。这不是有效的论据。

–viam0Zah
10-10-23在11:52

我完全同意你的观点。除了* nix以外,在其他任何地方部署php毫无意义。因此-使用PHP_EOL或DIRECTORY_SEPARATOR没有意义。

–斯坦
2011年1月19日,12:10

@Stann您能解释一下“除* nix以外的任何东西上部署php毫无意义”的观点吗?

– Sajuuk
17年8月30日在6:43

@Sajuuk我相信这将被称为“讽刺”。

–FélixGagnon-Grenier
18年2月21日在14:05

#9 楼

有一个明显的地方可能有用:在编写主要使用单引号字符串的代码时。关于以下方面是否有争议:混合和匹配''和“”的问题在于,当您得到长字符串时,您实际上并不需要去寻找使用哪种类型的引号。

和生活中的所有事物一样,它取决于上下文。

#10 楼

DOS / Windows标准“换行符”是CRLF(= \ r \ n),而不是LFCR(\ n \ r)。如果我们使用后者,则可能会产生一些意想不到的(实际上,实际上是预期的!!)行为。 n)对于换行代码,甚至是邮件发送方守护程序(RFC将CRLF设置为标头和消息正文的换行)。

#11 楼

如果您要输出多行代码,那么可以使用error_log()方便。 />

#12 楼

我在必须编写的某些命令行脚本中使用了PHP_EOL常量。我在本地Windows计算机上进行开发,然后在Linux服务器盒上进行测试。使用常量意味着我不必担心针对每个不同平台使用正确的行结尾。

#13 楼

我有一个站点,在该站点上,用户可以使用任何OS进行操作后,日志记录脚本都会在文本文件中写一行新文本。这个案例。如果用户在Mac OS上并写入文本文件,它将放置\ n。在Windows计算机上打开文本文件时,不会显示换行符。因此,我使用“ \ r \ n”代替,它可以在任何操作系统上打开文件时使用。

#14 楼

您正在编写主要使用单引号字符串的代码。

echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;  
echo 'this other $one'."\n";


#15 楼

我正在使用WebCalendar,并发现Mac iCal在导入生成的ics文件时使用barfs,因为行尾在xcal.php中被硬编码为“ \ r \ n”。我进去并用PHP_EOL替换了所有出现的内容,现在iCal很高兴!
我也在Vista上进行了测试,即使行尾字符为“ \ n”,Outlook也能够导入文件。

评论


这意味着您的应用程序在Windows服务器上部署时将发生故障。如果需要\ n,请明确使用。

– duskwuff-非活动状态-
17年11月16日在1:53

#16 楼

当jumi(PHP的joomla插件)​​出于某种原因编译您的代码时,它将删除代码中的所有反斜杠。这样类似$csv_output .= "\n";的东西变成$csv_output .= "n";

非常烦人的错误!

评论


我真的很希望这是您尚未发现的配置问题。我还没有使用过joomla,但是如果那真的是怎么工作的,那真是太糟糕了!

– jon_darkstar
2010-12-04 21:52

#17 楼

在某些系统上使用此常量可能很有用,因为例如,如果您正在发送电子邮件,则可以使用PHP_EOL使跨系统脚本在更多系统上运行...但是,即使有时有用,您也可以找到此常量常量未定义,使用最新的php引擎进行现代托管不会出现此问题,但是我认为一件好事是编写可以节省这种情况的代码:可以毫无问题地使用PHP_EOL ...显而易见,应该在应该立即在更多系统上运行的脚本上使用PHP_EOL,否则可以使用\ n或\ r或\ r \ n ...

注意:PHP_EOL可以是

<?php
  if (!defined('PHP_EOL')) {
    if (strtoupper(substr(PHP_OS,0,3) == 'WIN')) {
      define('PHP_EOL',"\r\n");
    } elseif (strtoupper(substr(PHP_OS,0,3) == 'MAC')) {
      define('PHP_EOL',"\r");
    } elseif (strtoupper(substr(PHP_OS,0,3) == 'DAR')) {
      define('PHP_EOL',"\n");
    } else {
      define('PHP_EOL',"\n");
    }
  }
?>


希望这个答案有帮助。

#18 楼

输出到Windows客户端时,我刚刚遇到此问题。当然,PHP_EOL是针对服务器端的,但是php的大多数内容输出都是针对Windows客户端的。因此,我必须将发现的内容留给下一位。

A)echo'My Text'。 PHP_EOL; //不好,因为它只输出\ n,大多数版本的Windows记事本在一行上显示,大多数Windows记帐软件不能导入这种类型的行尾字符。 '我的文字\ r \ n'; //错误,因为单引号的php字符串不能解释\ r \ n

C)echo“ My Text \ r \ n”; //是的,它起作用了!在记事本中看起来正确,并且可以在将文件导入其他Windows软件(例如Windows记帐和Windows制造软件)时使用。

#19 楼

我更喜欢使用\ n \ r。同样,我在Windows系统上,\ n在我的经验中也可以正常工作。用过或需要使用。

评论


当心换行符,它应该是\ r \ n(CR + LF):en.wikipedia.org/wiki/Newline

–azkotoki
2011-2-9在10:11

您没有使用它,但是您的站点可以由任何人在任何PC上打开,因此可能是一个问题

– Owaiz Yusufi
17年8月7日在9:20