什么时候使用是个好主意PHP_EOL
?
我有时会在 PHP 的代码示例中看到这一点。这是否处理 DOS/Mac/Unix 端行问题?
是的,PHP_EOL
表面上用于以跨平台兼容的方式查找换行符,因此它可以处理 DOS/Unix 问题。
注意PHP_EOL代表当前系统的结束符。例如,在类 Unix 系统上执行时,它不会找到 Windows 结束行。
从main/php.h
PHP 版本 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 源支持的可能值,因为它还没有在这里显示......
当您PHP_EOL
想要一条新线路并且想要跨平台时使用。
这可能是当您将文件写入文件系统(日志、导出等)时。
如果您希望生成的 HTML 可读,可以使用它。因此,您可以<br />
使用PHP_EOL
.
如果您将 php 作为 cron 脚本运行,并且需要输出一些内容并将其格式化为屏幕,则可以使用它。
如果您正在构建一封电子邮件以发送需要一些格式的电子邮件,则可以使用它。
PHP_EOL (string) 此平台的正确“行尾”符号。自 PHP 4.3.10 和 PHP 5.0.2 起可用
当您在服务器的文件系统上读取或写入文本文件时,您可以使用此常量。
在大多数情况下,行尾无关紧要,因为大多数软件都能够处理文本文件,无论其来源如何。您应该与您的代码保持一致。
如果行尾很重要,请明确指定行尾而不是使用常量。例如:
\r\n
\r\n
行分隔符我想提出一个解决“何时不使用它”的答案,因为它尚未被涵盖,并且可以想象它被盲目使用,直到后来没有人注意到存在问题。其中一些与现有的一些答案有些矛盾。
如果以 HTML 格式输出到网页,尤其是 中的文本<textarea>
,<pre>
或者<code>
您可能总是想使用\n
而不是PHP_EOL
.
这样做的原因是,虽然代码可能在一个服务器上运行良好 - 这恰好是一个类 Unix 平台 - 如果部署在 Windows 主机(如 Windows Azure 平台)上,那么它可能会改变页面在某些浏览器中的显示方式(特别是 Internet Explorer - 某些版本会同时看到 \n 和 \r)。
我不确定自 IE6 以来这是否仍然是一个问题,所以它可能相当有争议,但如果它有助于人们提示考虑上下文,似乎值得一提。可能还有其他情况(例如严格的 XHTML)\r
在某些平台上突然输出 ' 可能会导致输出出现问题,我相信还有其他类似的边缘情况。
正如有人已经指出的那样,在返回 HTTP 标头时您不希望使用它 - 因为它们应该始终遵循任何平台上的 RFC。
我不会将它用于 CSV 文件的分隔符(正如有人建议的那样)。运行服务器的平台不应确定生成或使用文件中的行结尾。
不,PHP_EOL 不处理 endline 问题,因为您使用该常量的系统与您将输出发送到的系统不同。
我根本不建议使用 PHP_EOL。Unix/Linux 使用 \n,MacOS / OS X 也从 \r 更改为 \n,在 Windows 上,许多应用程序(尤其是浏览器)也可以正确显示它。在 Windows 上,将现有的客户端代码更改为仅使用 \n 并且仍然保持向后兼容性也很容易:只需将行修剪的分隔符从 \r\n 更改为 \n 并将其包装在类似 trim() 的函数中.
我发现 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";
}
?>
PHP_EOL 的定义是它为您提供正在使用的操作系统的换行符。
在实践中,你几乎不需要这个。考虑几个案例:
当您输出到网络时,除了您应该保持一致之外,实际上没有任何约定。由于大多数服务器都是 Unixy,所以无论如何您都需要使用“\n”。
如果要输出到文件,PHP_EOL 似乎是个好主意。但是,您可以通过在文件中添加文字换行符来获得类似的效果,如果您尝试在 Unix 上运行一些 CRLF 格式的文件而不破坏现有的换行符(作为具有双引导系统的人),这将帮助您,我可以说我更喜欢后一种行为)
PHP_EOL 太长了,真的不值得使用它。
有一个明显的地方它可能有用:当您编写主要使用单引号字符串的代码时。关于是否:
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
它的艺术是一致的。混合匹配 '' 和 "" 的问题在于,当你得到长字符串时,你真的不想去寻找你使用的引用类型。
与生活中的所有事物一样,这取决于上下文。
我在必须编写的一些命令行脚本中使用 PHP_EOL 常量。我在本地 Windows 机器上开发,然后在 Linux 服务器上进行测试。使用常量意味着我不必担心为每个不同的平台使用正确的行尾。
DOS/Windows 标准“换行符”是 CRLF (= \r\n) 而不是 LFCR (\n\r)。如果我们把后者放在后面,它可能会产生一些意想不到的(嗯,事实上,有点预期!:D)行为。
如今,几乎所有(编写良好的)程序都接受 UNIX 标准 LF (\n) 作为换行代码,甚至是邮件发送者守护进程(RFC 将 CRLF 设置为标题和消息正文的换行)。
如果您要输出多行,则使用 error_log() 很方便。
我发现很多调试语句在我的 Windows 安装中看起来很奇怪,因为开发人员在分解字符串时假设了 unix 结尾。
我有一个站点,在用户执行操作后,日志记录脚本将新行文本写入文本文件,用户可以使用任何操作系统。
在这种情况下,使用 PHP_EOL 似乎不是最佳选择。如果用户在 Mac OS 上并写入文本文件,它将放置 \n。在 Windows 计算机上打开文本文件时,它不显示换行符。出于这个原因,我使用“\r\n”代替它在任何操作系统上打开文件时都有效。
我正在使用 WebCalendar 并发现 Mac iCal barfs 在导入生成的 ics 文件时因为行尾在 xcal.php 中被硬编码为“\r\n”。我进去并用 PHP_EOL 替换了所有出现的地方,现在 iCal 很高兴!我还在 Vista 上对其进行了测试,Outlook 也能够导入文件,即使行尾字符是“\n”。
您正在编写主要使用单引号字符串的代码。
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
我刚刚在输出到 Windows 客户端时遇到了这个问题。当然,PHP_EOL 用于服务器端,但 php 的大多数内容输出是用于 Windows 客户端的。所以我必须把我的发现放在这里给下一个人。
A)回声“我的文字”。PHP_EOL;// 不好,因为这只是输出 \n 并且大多数版本的 windows 记事本将其显示在一行上,并且大多数 windows 会计软件无法导入这种类型的行尾字符。
B) 回显“我的文本\r\n”;//不好,因为单引号 php 字符串不解释 \r\n
C)回显“我的文本\r\n”;// 是的,它有效!在记事本中看起来正确,并且在将文件导入其他 Windows 软件(如 Windows 会计和 Windows 制造软件)时工作。
当 jumi(PHP 的 joomla 插件)出于某种原因编译您的代码时,它会从您的代码中删除所有反斜杠。这样的东西$csv_output .= "\n";
变成$csv_output .= "n";
很烦人的bug!
改用 PHP_EOL 来获得你想要的结果。
在某些系统上使用此常量可能很有用,因为例如,如果您正在发送电子邮件,您可以使用 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
希望这个答案有所帮助。
我更喜欢使用\n\r。此外,我在 Windows 系统上,\n 根据我的经验工作得很好。
由于 PHP_EOL 不适用于正则表达式,而这些是处理文本最有用的方法,所以我真的从未使用过或不需要使用它。