PHP_EOL
是一个好主意?我有时会在PHP的代码示例中看到这一点。这样可以处理DOS / Mac / Unix终端问题吗?
#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 pedantry>
–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也能够导入文件。
评论
– 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
评论
我认为在此页面上已投票的答案中有很多令人误解的建议。如果您在两个不同的平台上运行脚本,然后比较输出或生成的数据(日志文件,html页面,数据库记录等),则PHP_EOL将导致差异不匹配。在大多数情况下,这不是您想要的。