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

时间:2008-09-24 17:34:39

标签: php eol

何时使用PHP_EOL是个好主意?

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

19 个答案:

答案 0 :(得分:334)

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

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

答案 1 :(得分:84)

来自PHP版本7.1.1的main/php.h和版本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

正如您所看到的,PHP_EOL可以是"\r\n"(在Windows服务器上)或"\n"(在其他任何内容上)。在PHP版本之前 5.4.0RC8上,PHP_EOL可能有第三个值:"\r"(在MacOSX服务器上)。这是错误的,并已在2012-03-01与bug 61193修复。

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

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

答案 2 :(得分:79)

当您想要换行时,可以使用PHP_EOL,并且想要跨平台。

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

如果您希望生成的HTML可读,则可以使用它。因此,您可以使用<br />跟踪PHP_EOL

如果您从cron运行php作为脚本并且需要输出内容并将其格式化为屏幕,则可以使用它。

如果要构建需要格式化的电子邮件,则可以使用它。

答案 3 :(得分:19)

  

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

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

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

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

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

答案 4 :(得分:11)

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

如果输出到HTML网页,特别是<textarea><pre><code>中的文字,您可能总是希望使用\n而不是PHP_EOL

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

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

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

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

答案 5 :(得分:10)

不,PHP_EOL不处理结束问题,因为使用该常量的系统与发送输出的系统不同。

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

答案 6 :(得分: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";
}
?>

答案 7 :(得分:6)

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

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

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

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

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

答案 8 :(得分:3)

DOS / Windows标准“换行符”是CRLF(= \ r \ n)而不是LFCR(\ n \ r)。如果我们放下后者,它可能会产生一些意想不到的(实际上,预期的那种!:D)行为。

现在几乎所有(编写良好的)程序都接受UNIX标准LF(\ n)用于换行代码,甚至邮件发件人守护程序(RFC将CRLF设置为标题和邮件正文的换行符)。

答案 9 :(得分:3)

有一个显而易见的地方可能有用:当您编写主要使用单引号字符串的代码时。它是否可以论证:

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

它的艺术是一致的。混合和匹配''和“”的问题在于,当你获得长串时,你真的不想去寻找你使用的引用类型。

与生活中的所有事情一样,这取决于具体情况。

答案 10 :(得分:2)

我有一个站点,其中一个日志记录脚本在用户的操作之后将一行新文本写入文本文件,该用户可以使用任何操作系统。

在这种情况下,使用PHP_EOL似乎不是最佳选择。如果用户在Mac OS上并写入文本文件,它将放置\ n。在Windows计算机上打开文本文件时,它不会显示换行符。出于这个原因,我使用&#34; \ r \ n&#34;相反,它在任何操作系统上打开文件时都有效。

答案 11 :(得分:1)

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

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

答案 12 :(得分:1)

如果输出多行,请使用error_log()。

我发现很多调试语句在我的Windows安装上看起来很奇怪,因为开发人员在分解字符串时假定了unix结尾。

答案 13 :(得分:0)

当jumi(PHP的joomla插件)​​由于某种原因编译代码时,会删除代码中的所有反斜杠。像$csv_output .= "\n";这样的内容会变成$csv_output .= "n";

非常烦人的错误!

使用PHP_EOL来获得您所追求的结果。

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

在某些系统上使用此常量可能很有用,因为例如,如果您正在发送电子邮件,则可以使用PHP_EOL来使跨系统脚本在更多系统上运行...但是,即使有时您有用可以找到具有最新php引擎的这个恒定的,未定义的现代主机,就没有这个问题,但是我认为一件好事是编写一些代码来保存这种情况:

<?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");
    }
  }
?>

因此,您可以毫无问题地使用PHP_EOL ...显然,PHP_EOL应该用于应该立即在更多系统上运行的脚本上,否则您可以使用\ n或\ r或\ r \ n ...

注意:PHP_EOL可以

1) on Unix    LN    == \n
2) on Mac     CR    == \r
3) on Windows CR+LN == \r\n

希望这个答案有帮助。

答案 17 :(得分:0)

在输出到Windows客户端时,我刚遇到此问题。当然,PHP_EOL是针对服务器端的,但是php的大多数内容输出都是针对Windows客户端的。因此,我必须将我的发现结果放在这里,供下一个人使用。

A)回显“我的文本”。 PHP_EOL; //不好,因为它只输出\ n,大多数版本的Windows记事本都在一行上显示,大多数Windows记帐软件无法导入这种类型的行尾字符。

B)回显“我的文字\ r \ n”; //不好,因为单引号的PHP字符串不能解释\ r \ n

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

答案 18 :(得分:-2)

我更喜欢使用\ n \ r。此外,我在Windows系统上,\ n根据我的经验工作得很好。

由于PHP_EOL不能与正则表达式一起使用,并且这些是处理文本的最有用的方法,所以我真的从未使用它或者需要它。