代码之家  ›  专栏  ›  技术社区  ›  Christian Oudard

何时使用PHP常量“PHP_EOL”?

  •  317
  • Christian Oudard  · 技术社区  · 18 年前

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

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

    17 回复  |  直到 11 年前
        1
  •  384
  •   Félix Adriyel Gagnon-Grenier    8 年前

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

    注意 PHP_EOL 表示对象的结束行字符 现在的 系统例如,在类unix系统上执行时,它将找不到Windows端点。

        2
  •  93
  •   AlexV    7 年前

    从…起 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" "\n" (在其他方面)。关于PHP版本 先前的 5.4.0RC8,有第三个可能的值 PHP_EOL : "\r" (在MacOSX服务器上)。这是错误的,已在2012-03-01与 bug 61193

    正如其他人已经告诉您的,您可以使用 PHP_EOL 在任何类型的输出中(其中 这些值中的任意一个都是有效的(如:HTML、XML、日志…),您需要在其中统一 newlines

    我只是想展示一下 PHP_EOL 由PHP源代码支持,因为它还没有在这里显示。。。

        3
  •  82
  •   John    9 年前

    你用 PHP_EOL

    这可能是在将文件写入文件系统(日志、导出等)时发生的。

    如果希望生成的HTML可读,可以使用它。所以你可以跟着你的 <br /> 用一个 .

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

        4
  •  21
  •   Salman Arshad    13 年前

    PHP_下线(字符串) 此平台的正确“线端”符号。 从PHP4.3.10和PHP5.0.2开始提供

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

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

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

    • HTTP头 \r\n
    • CSV文件 应该 使用 as行分隔符
        5
  •  12
  •   Prasad Rajapaksha    13 年前

    “使用它”,因为它还没有被涵盖,可以想象它被盲目使用,直到后来才有人注意到问题。其中一些与现有的一些答案有些矛盾。

    如果以HTML格式输出到网页,尤其是以 <textarea> , <pre> <code> 你可能总是想用 \n PHP_EOL .

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

    \r 在某些平台上的,可能会导致输出出现问题,我相信还有其他类似的边缘情况。

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

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

        6
  •  11
  •   StanE    11 年前

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

        7
  •  10
  •   Tyzoid 5gon12eder    13 年前

    我发现PHP_EOL对于文件处理非常有用,特别是在将多行内容写入文件时。

    例如,您有一个长字符串,您想在写入普通文件时将其分成多行。使用\r\n可能不起作用,因此只需将PHP\u 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";
    }
    ?>
    
        8
  •  6
  •   Edward Z. Yang    17 年前

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

    • 当你输出到网络上时,除了你应该保持一致外,实际上没有任何惯例。由于大多数服务器都是Unixy,因此您仍然需要使用“\n”。

    • 如果要输出到文件,PHP_EOL可能是个好主意。但是,通过在文件中使用文字换行符可以获得类似的效果,如果您试图在Unix上运行一些CRLF格式的文件而不破坏现有的换行符,这将有助于您解决问题(作为一个拥有双启动系统的人,我可以说我更喜欢后一种行为)

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

        9
  •  4
  •   SjH    15 年前

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

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

    就像生活中的所有事情一样,这取决于环境。

        10
  •  3
  •   chrismacp    17 年前

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

        11
  •  3
  •   mvp    13 年前

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

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

        12
  •  2
  •   Gavin Gilmour    17 年前

        13
  •  2
  •   intTiger    12 年前

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

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

        14
  •  1
  •   Lex    16 年前

    我正在使用WebCalendar,发现Mac iCal无法导入生成的ics文件,因为行尾在xcal.php中硬编码为“\r\n”。我进去用PHP_EOL替换了所有事件,现在iCal很高兴! 我还在Vista上测试了它,Outlook也可以导入该文件,即使行尾字符是“\n”。

        15
  •  1
  •   Vasu_Sharma    13 年前

    echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;  
    echo 'this other $one'."\n";
    
        16
  •  0
  •   sjngm quinti    14 年前

    当jumi(joomla-pluginforphp)出于某种原因编译代码时,它会删除代码中的所有反斜杠。例如 $csv_output .= "\n"; 变成 $csv_output .= "n";

    非常讨厌的虫子!

    使用PHP_EOL来获得您想要的结果。

        17
  •  0
  •   Alessandro    7 年前

    在某些系统上,使用此常量可能很有用,因为例如,如果您正在发送电子邮件,则可以使用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\u 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
    

    希望这个答案有帮助。

        18
  •  0
  •   hamish    6 年前

    A) 回显“我的文字”。PHP_EOL;//错误,因为这只输出\n并且大多数版本的windows记事本在一行上显示此内容,并且大多数windows记帐软件无法导入这种类型的行尾字符。

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

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

        19
  •  -2
  •   user226801 user226801    16 年前

    我更喜欢使用\n\r。此外,我使用的是windows系统,根据我的经验,\n工作正常。

    由于PHP_EOL不能处理正则表达式,而正则表达式是处理文本最有用的方法,因此我真的从未使用过它,也不需要使用它。