Когда я использую PHP-константу "PHP_EOL"? - PullRequest
333 голосов
/ 24 сентября 2008

Когда стоит использовать PHP_EOL?

Я иногда вижу это в примерах кода PHP. Это обрабатывает проблемы конечной линии DOS / Mac / Unix?

Ответы [ 18 ]

334 голосов
/ 24 сентября 2008

Да, PHP_EOL якобы используется для поиска символа новой строки в кроссплатформенной совместимости, поэтому он решает проблемы DOS / Unix.

Обратите внимание, что PHP_EOL представляет символ конца строки для текущей системы. Например, он не найдет конечную строку Windows при выполнении в Unix-подобной системе.

84 голосов
/ 12 июля 2011

С 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" (на любом другом). В версиях PHP до 5.4.0RC8 было возможно третье значение для PHP_EOL: "\r" (на серверах MacOSX). Это было неправильно и было исправлено в 2012-03-01 с ошибкой 61193 .

Как уже говорили другие, вы можете использовать PHP_EOL в любом виде вывода (где любые из этих значений действительны - например, HTML, XML, logs ...), где вы хотите унифицировать 1020 * новая строка *. Имейте в виду, что значение определяет сервер, а не клиент. Ваши посетители Windows получат данные с вашего Unix-сервера, что иногда неудобно для них.

Я просто хотел показать возможные значения PHP_EOL, подкрепленные источниками PHP, так как он еще не был показан здесь ...

79 голосов
/ 24 сентября 2008

Вы используете PHP_EOL, когда хотите новую строку и хотите быть кроссплатформенным.

Это может быть при записи файлов в файловую систему (журналы, экспорт, другое).

Вы можете использовать его, если хотите, чтобы сгенерированный HTML был читабельным. Таким образом, вы можете следовать за <br /> с PHP_EOL.

Вы бы использовали его, если запускаете php как скрипт из cron и вам нужно что-то вывести и отформатировать для экрана.

Вы можете использовать его, если создаете электронное письмо, для отправки которого необходимо некоторое форматирование.

19 голосов
/ 07 января 2013

PHP_EOL (строка) Правильный символ «Конец строки» для этой платформы. Доступно с PHP 4.3.10 и PHP 5.0.2

Эту константу можно использовать при чтении или записи текстовых файлов в файловой системе сервера.

Окончания строк в большинстве случаев не имеют значения, так как большинство программных средств способны обрабатывать текстовые файлы независимо от их происхождения. Вы должны соответствовать вашему коду.

Если окончания строк имеют значение, явно указывайте окончания строк вместо использования константы. Например:

  • HTTP-заголовки должен быть разделен на \r\n
  • CSV-файлы должны использовать \r\n в качестве разделителя строк
11 голосов
/ 15 мая 2013

Я хотел бы добавить ответ, который обращается к «Когда не , чтобы использовать это», поскольку это еще не было покрыто, и могу вообразить, что это используется вслепую, и никто не замечает, что есть проблема до позже по линии. Отчасти это несколько противоречит некоторым из существующих ответов.

Если вы выводите на веб-страницу в HTML, особенно текст в <textarea>, <pre> или <code>, вы, вероятно, всегда захотите использовать \n, а не PHP_EOL.

Причина этого заключается в том, что, хотя код может работать хорошо на одном сервере, который является платформой, подобной Unix, при развертывании на хосте Windows (например, платформе Windows Azure) он может изменить способ отображения страниц. в некоторых браузерах (в частности, Internet Explorer - в некоторых версиях будут отображаться как \ n, так и \ r).

Я не уверен, что это все еще проблема, начиная с IE6, или нет, так что это может быть довольно спорным, но, кажется, стоит упомянуть, если это помогает людям побуждать думать о контексте. Могут быть и другие случаи (например, строгий XHTML), в которых внезапный вывод \r на некоторых платформах может вызвать проблемы с выводом, и я уверен, что есть и другие крайние случаи, подобные этому.

Как уже заметил кто-то, вы не захотите использовать его при возврате заголовков HTTP - так как они всегда должны следовать RFC на любой платформе.

Я бы не использовал его для обозначения разделителей в файлах CSV (как кто-то предлагал). Платформа, на которой работает сервер, не должна определять окончания строк в генерируемых или потребляемых файлах.

10 голосов
/ 23 августа 2015

Нет, PHP_EOL не обрабатывает проблемы с конечной линией, потому что система, в которой вы используете эту константу, не та же система, в которую вы отправляете вывод.

Я бы не рекомендовал использовать PHP_EOL вообще. Unix / Linux используют \ n, MacOS / OS X также изменилась с \ r на \ n, и в Windows многие приложения (особенно браузеры) также могут отображать его правильно. В Windows также легко изменить существующий код на стороне клиента, чтобы использовать только \ n, и при этом поддерживать обратную совместимость: просто измените разделитель для обрезки строки с \ r \ n на \ n и оберните его в функции, похожей на trim () .

9 голосов
/ 04 октября 2010

Я нашел 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";
}
?>
6 голосов
/ 22 апреля 2009

Определение PHP_EOL заключается в том, что он дает вам символ новой строки операционной системы, над которой вы работаете.

На практике вам это почти никогда не нужно. Рассмотрим несколько случаев:

  • Когда вы выводите в Интернет, на самом деле нет никаких соглашений, кроме того, что вы должны быть последовательными. Поскольку большинство серверов Unixy, вы все равно захотите использовать \ n.

  • Если вы выводите в файл, PHP_EOL может показаться хорошей идеей. Тем не менее, вы можете получить аналогичный эффект, имея буквальный символ новой строки внутри вашего файла, и это поможет вам, если вы попытаетесь запустить некоторые файлы в формате CRLF в Unix, не забивая существующие символы новой строки (как парень с двойной загрузкой системы). Могу сказать, что предпочитаю последнее поведение)

PHP_EOL настолько смехотворно длинен, что его действительно не стоит использовать.

3 голосов
/ 14 января 2011

DOS / Windows стандартная "новая строка" - это CRLF (= \ r \ n), а не LFCR (\ n \ r). Если мы добавим последнее, оно может привести к неожиданному (ну, на самом деле, ожидаемому!: D) поведению.

В настоящее время почти все (хорошо написанные) программы принимают стандарт UNIX LF (\ n) для кода новой строки, даже демоны отправителя почты (RFC устанавливает CRLF как newline для заголовков и тела сообщения).

3 голосов
/ 09 февраля 2011

Есть одно очевидное место, где это может быть полезно: когда вы пишете код, который преимущественно использует строки в одинарных кавычках. Его спорно, является ли:

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

Искусство это быть последовательным. Проблема со смешиванием и соответствием '' и "" состоит в том, что когда вы получаете длинные строки, вам не нужно охотиться за тем, какой тип цитаты вы использовали.

Как и все вещи в жизни, это зависит от контекста.

...