395

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

我有时会在 PHP 的代码示例中看到这一点。这是否处理 DOS/Mac/Unix 端行问题?

4

19 回答 19

390

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

注意PHP_EOL代表当前系统的结束符。例如,在类 Unix 系统上执行时,它不会找到 Windows 结束行。

于 2008-09-24T17:35:53.433 回答
96

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

如您所见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_EOL由 PHP 源支持的可能值,因为它还没有在这里显示......

于 2011-07-12T15:15:55.800 回答
84

当您PHP_EOL想要一条新线路并且想要跨平台时使用。

这可能是当您将文件写入文件系统(日志、导出等)时。

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

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

如果您正在构建一封电子邮件以发送需要一些格式的电子邮件,则可以使用它。

于 2008-09-24T19:35:52.957 回答
22

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

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

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

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

  • HTTP 标头必须\r\n
  • CSV 文件应用\r\n行分隔符
于 2013-01-07T13:06:26.720 回答
12

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

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

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

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

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

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

于 2013-05-15T11:20:33.147 回答
11

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

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

于 2015-08-23T11:35:08.103 回答
10

我发现 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";
}
?>
于 2010-10-04T07:59:53.720 回答
6

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

在实践中,你几乎不需要这个。考虑几个案例:

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

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

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

于 2009-04-21T22:06:16.043 回答
4

有一个明显的地方它可能有用:当您编写主要使用单引号字符串的代码时。关于是否:

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

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

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

于 2011-02-09T11:03:15.283 回答
3

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

于 2009-09-08T15:01:38.193 回答
3

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

如今,几乎所有(编写良好的)程序都接受 UNIX 标准 LF (\n) 作为换行代码,甚至是邮件发送者守护进程(RFC 将 CRLF 设置为标题和消息正文的换行)。

于 2011-01-14T17:15:44.183 回答
2

如果您要输出多行,则使用 error_log() 很方便。

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

于 2009-06-22T12:25:22.853 回答
2

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

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

于 2014-07-18T08:16:43.610 回答
1

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

于 2009-11-06T18:24:40.193 回答
1

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

echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;  
echo 'this other $one'."\n";
于 2013-03-13T11:54:22.807 回答
1

我刚刚在输出到 Windows 客户端时遇到了这个问题。当然,PHP_EOL 用于服务器端,但 php 的大多数内容输出是用于 Windows 客户端的。所以我必须把我的发现放在这里给下一个人。

A)回声“我的文字”。PHP_EOL;// 不好,因为这只是输出 \n 并且大多数版本的 windows 记事本将其显示在一行上,并且大多数 windows 会计软件无法导入这种类型的行尾字符。

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

C)回显“我的文本\r\n”;// 是的,它有效!在记事本中看起来正确,并且在将文件导入其他 Windows 软件(如 Windows 会计和 Windows 制造软件)时工作。

于 2019-11-05T04:44:48.703 回答
0

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

很烦人的bug!

改用 PHP_EOL 来获得你想要的结果。

于 2010-05-18T02:20:20.657 回答
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

希望这个答案有所帮助。

于 2019-03-10T09:16:38.083 回答
-2

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

由于 PHP_EOL 不适用于正则表达式,而这些是处理文本最有用的方法,所以我真的从未使用过或不需要使用它。

于 2009-12-11T01:17:31.637 回答