Когда использовать константу PHP «PHP_EOL»?

Когда лучше использовать PHP_EOL?

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

Я думаю, что в ответах, за которые проголосовали на этой странице, есть много вводящих в заблуждение советов. Если вы запустите сценарий на двух разных платформах, а затем сравните выходные или сгенерированные данные (файлы журналов, html-страницу, записи базы данных и т. д.), То PHP_EOL приведет к несоответствию в diff. В большинстве случаев это не то, что вам нужно.

donquixote 15.03.2018 17:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
375
1
387 400
19
Перейти к ответу Данный вопрос помечен как решенный

Ответы 19

Ответ принят как подходящий

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

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

Следует ли использовать его в качестве символа конца строки при написании сценария командной строки?

Thomas Owens 24.09.2008 21:37

@Andre: А как насчет тех, кто пишет приложения для установки, использования и развертывания другими? Вы предлагаете, чтобы все они ограничили свои «поддерживаемые платформы» до * nix?

Cylindric 04.03.2011 13:52

@Andre Может быть, потому что ваша платформа развертывания - Windows Azure?

middus 22.07.2011 21:59

@Stann - То, что делают «большие проекты», о которых вы знаете, вряд ли является решающим фактором для лучшей практики, не говоря уже о том, что полезно или нет. Я поддерживаю «большой проект», который частично развернут на нескольких хостах, включая некоторые серверы Windows. Не предполагайте - константы ничего не повредят и представляют собой вполне допустимый способ написания кода, независимого от платформы. Ваши комментарии об обратном несколько абсурдны.

Chris Baker 13.09.2012 23:12

Вот почему в Sublime Text или любой другой IDE, которую вы используете, у вас есть возможность использовать 3 разных конца строк: Unix, OSX, DOS или auto. Правильный символ «Конец линии» для этой платформы. Доступно с PHP 4.3.10 и PHP 5.0.2. php.net/manual/en/reserved.constants.php

Michael J. Calkins 17.11.2013 06:43

Нет, я не думаю, что ваш ответ правильный. Вы генерируете код в одной системе, но отправляете вывод в другую систему. PHP_EOL, однако, сообщает вам ограничитель конца строки ТОЛЬКО для системы, в которой он используется. Это не гарантирует, что другая система использует тот же разделитель. Смотрите мой ответ ниже.

StanE 23.08.2015 14:43

"для локальной системы" следует включить, но я думаю, что это всем известно.

Heroselohim 28.05.2016 22:32

но не используйте PHP_EOL для данных, отправленных из формы.

Nabi K.A.Z. 10.11.2016 13:13

Официальная документация по PHP_EOL должна быть на php.net. Поиск PHP_EOL не дает прямой целевой страницы (php.net/manual-lookup.php?pattern=php_eol&scope=quickref). Существует как раз указанная выше информация @ MichaelJ.Calkins (php.net/manual/en/reserved.constants.php).

Peter 20.12.2017 12:35

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

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

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

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

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

Вам не нужно использовать независимые от платформы символы новой строки при создании HTML.

Rob 22.04.2009 02:00

@Rob, Если бы более старые версии IE дали мне лучшую программу просмотра исходных текстов страниц, чем блокнот Windows, я, возможно, согласился бы с вами.

Zoredache 23.01.2010 04:18

@Zoredache - HTML будет сгенерирован с символами новой строки, подходящими для платформы, на которой работает PHP, не обязательно подходящей для платформы, с которой вы получаете доступ к страницам.

Dominic Rodger 02.02.2010 11:43

+1 за упоминание о создании электронной почты $header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;

Jakob Cosoroaba 17.05.2010 16:13
PHP_EOL не следует использовать для разделения заголовков электронной почты. According to Почта PHP manual, multiple extra headers should be separated with a CRLF (\r\n).
Halil Özgür 27.11.2010 16:55

@ HalilÖzgür Это правда. RFC. Но к сожалению, это не так в PHP. И я проверил, у v5.4.11 такой же код.

e2-e4 15.03.2013 12:54

@ ring0, к сожалению :) Всякий раз, когда мне нужно отправлять электронные письма на PHP, в большинстве случаев я использую Swift Mailer; для бесконечного множества деталей требований к формату электронной почты и несоответствий PHP.

Halil Özgür 15.03.2013 13:35

Пример: $ headers = 'From: [email protected]'. "\ г \ п". "Ответить: [email protected]". "\ г \ п". 'X-Mailer: PHP /'. phpversion ();

zloctb 23.09.2013 20:29

@ halil-ozgur можно ли использовать PHP_EOF для строк внутри тела почты в PHP?

Lexib0y 04.02.2014 15:41

@ Lexib0y TL; DR; нет, используйте CRLF. Вы имеете в виду PHP_EOL, верно? Согласно последнему RFC, нет. Вы также должны использовать CRLF. Но различные почтовые серверы и клиенты могут выглядеть терпимыми, даже если вы используете PHP_EOL (который является CRLF только в Windows и LF для большинства других), но я все равно не стал бы на них полагаться.

Halil Özgür 04.02.2014 17:33

Да, я имел ввиду PHP_EOL. Спасибо за информацию. Мне трудно найти относительную информацию в одном месте или вообще найти. Я никогда особо не вдавался в RFC. Спасибо за Ваш ответ.

Lexib0y 04.02.2014 19:14

You might use it if you where building up an email to send that needed some formatting.. Какой ужасный пример, как будто получатель определенно будет использовать ту же ОС.

Salman von Abbas 19.02.2014 23:27

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

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

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

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

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

-1 за «PHP_EOL такой смехотворно длинный». Это неверный аргумент.

viam0Zah 23.10.2010 15:52

Я полностью согласен с тобой. Нет никакого смысла разворачивать php на чем угодно, кроме * nix. Таким образом, нет смысла использовать PHP_EOL или DIRECTORY_SEPARATOR.

Stann 19.01.2011 15:10

@Stann Не могли бы вы объяснить свою точку зрения о том, что «нет никакого смысла развертывать php на чем-либо, кроме * nix»?

Sajuuk 30.08.2017 09:43

@Sajuuk Я думаю, это можно было бы назвать "сарказмом".

Félix Gagnon-Grenier 21.02.2018 17:05

Удобно с error_log (), если вы выводите несколько строк.

Я обнаружил, что многие отладочные операторы выглядят странно при моей установке Windows, поскольку разработчики предполагали окончания unix при разбиении строк.

Я использую константу PHP_EOL в некоторых сценариях командной строки, которые мне приходилось писать. Я разрабатываю на своей локальной машине с Windows, а затем тестирую на сервере Linux. Использование константы означало, что мне не нужно было беспокоиться об использовании правильного окончания строки для каждой из разных платформ.

Я использую WebCalendar и обнаружил, что Mac iCal блокирует импорт сгенерированного файла ics, потому что конец строки жестко запрограммирован в xcal.php как «\ r \ n». Я вошел и заменил все вхождения на PHP_EOL, и теперь iCal счастлив! Я также тестировал его в Vista, и Outlook также смог импортировать файл, даже если символ конца строки - «\ n».

<late> Это означает, что ваше приложение выйдет из строя при развертывании на сервере Windows. Если вам нужен \n, используйте его явно.

duskwuff -inactive- 16.11.2017 04:53

Я предпочитаю использовать \ n \ r. Также я использую систему Windows, и \ n, по моему опыту, отлично работает.

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

Остерегайтесь порядка символа новой строки, он должен быть \ r \ n (CR + LF): en.wikipedia.org/wiki/Newline

azkotoki 09.02.2011 13:11

Вы не используете его, но ваш сайт может быть открыт кем угодно на любом компьютере, поэтому это может быть проблемой

Owaiz Yusufi 07.08.2017 12:20

Когда jumi (плагин joomla для PHP) компилирует ваш код, по какой-то причине он удаляет все обратные косые черты из вашего кода. Так что что-то вроде $csv_output .= "\n"; становится $csv_output .= "n";

Очень досадный баг!

Вместо этого используйте PHP_EOL, чтобы получить желаемый результат.

Я действительно ДЕЙСТВИТЕЛЬНО надеюсь, что это проблема конфигурации, которую вы еще не нашли. Я не использовал joomla, но какое ужасное поведение, если это действительно так!

jon_darkstar 07.12.2010 00:52

Я нашел 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";
}
?>

\ n \ r никогда не будет работать, поскольку последовательность предназначена для \ r \ n </pedantry>

frak 26.11.2010 15:04

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

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

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

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

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

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

Из 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). Это было неправильно и было исправлено 01.03.2012 с помощью ошибка 61193.

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

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

Вау. Разработчики PHP ошибаются в этом. В приведенной вами ссылке на Википедию Mac OS 9 и ранее использовала «\ r», но не OS X, которая использует «\ n». Кто-то должен отправить отчет об ошибке ...

imgx64 28.01.2012 11:32

@ imgx64 Да, может быть, но, честно говоря, вы когда-нибудь видели производственный MAC-сервер?

AlexV 30.01.2012 17:53

@ imgx64 Это было исправлено через 33 дня после вашего сообщения :) Я обновил свой ответ, чтобы отразить текущие источники.

AlexV 25.01.2013 20:33

Я не думаю, что аргумент в пользу использования PHP_EOL для вывода (!) Верен. PHP_EOL является серверным, тогда как вывод обычно предназначен для клиента (который использует разные разделители конца строки). Пример: если вы создаете многострочный текстовый вывод в системе Linux с помощью PHP_EOL и отправляете его в систему Windows, это не будет допустимый ограничитель конца строки - это будет зависеть от того, какое клиентское программное обеспечение будет отображать вывод. Браузеры и некоторые текстовые редакторы могут справиться с этим, но если вы просматриваете текст, например, в Блокноте, все будет в одной строке.

StanE 23.08.2015 13:47

php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;", чтобы узнать.

Bob Stein 09.11.2017 19:04

PHP_EOL (string) The correct 'End Of Line' symbol for this platform. Available since PHP 4.3.10 and PHP 5.0.2

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

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

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

  • Заголовки HTTP должен разделяются \r\n
  • Файлы CSV должен используют \r\n в качестве разделителя строк

источник для «HTTP-заголовки должны быть ...»: ietf.org/rfc/rfc2616.txt глава 4 раздел 1

Adrian Föder 14.05.2016 15:02
SMTP message lines должен be terminated by \r\n
Bob Stein 09.11.2017 19:12

Вы пишете код, который преимущественно использует строки в одинарных кавычках.

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

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

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

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

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

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

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

У меня есть сайт, на котором сценарий ведения журнала записывает новую строку текста в текстовый файл после действия пользователя, который может использовать любую ОС.

Использование PHP_EOL в этом случае не кажется оптимальным. Если пользователь работает с Mac OS и пишет в текстовый файл, он помещает \ n. При открытии текстового файла на компьютере с Windows разрыв строки не отображается. По этой причине я использую вместо этого "\ r \ n", который работает при открытии файла в любой ОС.

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

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

Было бы неплохо узнать, почему мой ответ отвергнут ... Безумно ... Принятый ответ - неправильный, а мой правильный. В целом неверно утверждать, что PHP_EOL решает эту проблему. Его можно (и нужно) использовать при чтении или записи ИСКЛЮЧИТЕЛЬНО чего-либо в / из системы такой же. Но в большинстве случаев PHP используется для отправки чего-либо обратно клиенту (что, скорее всего, именно об этом думал собеседник). Опять же: PHP_EOL - это чисто серверная константа. Он НЕ (и не может) правильно обрабатывать разрывы строк на стороне клиента. Напишите, пожалуйста, комментарий и скажите, если считаете, что я что-то не так написал.

StanE 10.07.2016 20:04

+1 за хорошую точку зрения. Я думаю, что это потеряно, потому что браузеры не отображают пробелы в html, поэтому обычно используются консольные приложения. И, как вы сказали, в этом случае конец строки будет интерпретироваться для среды выполнения, что имеет смысл для консольных приложений, но не для веб-приложений клиент-сервер.

Jeff Puckett 22.09.2016 15:02

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

grantwparks 31.10.2018 08:03

В некоторых системах может быть полезно использовать эту константу, потому что если, например, вы отправляете электронное письмо, вы можете использовать PHP_EOL, чтобы кросс-системный скрипт работал с большим количеством систем ... но даже если это полезно когда-нибудь, вы можете найти это constant undefined, современный хостинг с последним движком 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

Надеюсь, этот ответ поможет.

Я только что столкнулся с этой проблемой при выводе на клиент Windows. Конечно, PHP_EOL предназначен для серверной части, но большая часть содержимого, выводимого с php, предназначена для клиентов Windows. Так что я должен разместить здесь свои выводы для следующего человека.

А) эхо «Мой текст». PHP_EOL; // Плохо, потому что это просто выводит \ n, и большинство версий блокнота Windows отображают это в одной строке, и большинство программ бухгалтерского учета Windows не могут импортировать этот тип символа конца строки.

Б) echo 'Мой текст \ r \ n'; // Плохо, потому что строки php в одинарных кавычках не интерпретируют \ r \ n

В) эхо "Мой текст \ r \ n"; // Ура, работает! Правильно выглядит в блокноте и работает при импорте файла в другое программное обеспечение Windows, такое как программное обеспечение для бухгалтерского учета Windows и программное обеспечение для производства Windows.

Другие вопросы по теме